Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Então gente, como falei na Parte 1 Sobre
Como anexar filhos a um Elemento, é navegar pelo XML, nessa parte, vou fazer um exemplo mais pratico de como encontrar
um elemento por uma definição mais avançada, e aí que entra o XPath , alguém conhece ? já ouviu falar ?
ok, é ele quem usamos para poder navegar no documento de uma maneira mais fácil .. e achar alguns elementos no documento
também mais facilmente, vejam o seguinte .. na aula passada . tínhamos o seguinte Heredoc com uma estrutura XML de um álbum
aí vem a cabeça 'do que adianta guardar fotografias de usuário, álbuns. sendo que não podemos identificar de quem é aquele álbum ?'
quem pensa isso tá muito enganado, ou quem acha que não é possível ... ^_^
Então, nos paramos no seguinte XML na parte anterior ..
<?php
$XML = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<albums>
<album usuario="0669">
<capa src="meuPrimeiroAlbum.jpg" />
<foto id="1" classificacao="5" src="umaFoto1.jpg" />
<foto id="2" classificacao="5" src="umaFoto2.jpg" />
<foto id="3" classificacao="4" src="umaFoto3.jpg" />
<foto id="4" classificacao="2" src="umaFoto4.jpg" />
<foto id="5" classificacao="1" src="umaFoto5.jpg" />
<foto id="6" classificacao="2" src="umaFoto6.jpg"/>
</album>
</albums>
XML;
Quem viu a parte anterior, eu deixei explicado como navegar nesse XML usando métodos normais como getElementsByTagName, entre outros ..
Mais agora um exemplo mais pratico é mais focado, vamos usar um DOMXPath, para encontrar os albuns do usuário, vou armazenar o ID do usuário
em uma variável normalmente, mais quem for tentar fazer isso usando XML
no que certamente guarda em uma session, ou cookie .. da pra fazer do mesmo jeito, então vamos começar
eu tenho apenas 1 álbum então vamos criar outros álbuns, porem com id's de usuário diferentes, para terem uma noção melhor
de como funciona a seleção desses elementos com XML.
Então, temos o seguinte código
<?php
#Instancia da classe DOMDocument, versão 1.0, codificaçao utf-8
$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
#formatOutput como true para uma boa idençao
$DOMDocument->formatOutput = true;
#Não preservar espaços em branco redundantes
$DOMDocument->preserveWhiteSpace = false;
#Carrega um xml da string heredox $XML
$DOMDocument->loadXML( $XML );
#Pega o filho de albums, no caso é album
$Albums = $DOMDocument->getElementsByTagName( 'albums' )->item(0);
#Então cria um novo album
$AlbumTag = $DOMDocument->createElement( 'album' );
#Coloco o id de usuario que pertençe a tal album
$AlbumTag->setAttribute( 'usuario', 1589 );
#Anexa o elemento pai 'album' em 'albums'
$Album = $Albums->appendChild( $AlbumTag );
#Então, cria o elemento capa, que sera anexado para album
$Capa = $DOMDocument->createElement( 'capa' );
#Seta o attributo src, no caso um path para capa do album
$Capa->setAttribute( 'src', 'capas/umaCapa.jpg' );
#Em album, anexa a tag Capa
$Album->appendChild( $Capa );
#Array de fotos, usado apenas pra addiantar o trabalho .
$Fotos = Array( 'fotoDoUsuario1589.jpg', 'fotoDoUsuario1589.png', 'fotoDoUsuario1598.jpg' );
#Array de classificaçoes
$Classificacoes = Array( 5, 2, 3 );
/*
* Loop para criar cada tag foto de acordo com a quantidade no array
*/
for( $x = 0; $x < sizeOf($Fotos); ++$x ){
$FotoTag = $DOMDocument->createElement( 'foto' );
$FotoTag->setAttribute( 'id', $x+1 );
$FotoTag->setAttribute( 'classificacao', $Classificacoes[$x] );
$FotoTag->setAttribute( 'src', $Fotos[$x] );
$Album->appendChild( $FotoTag );
}
#Imprime o xml apos as modificaçoes
echo $DOMDocument->saveXML();
Temos o seguinte output apos o codigo executado ..
<?xml version="1.0" encoding="utf-8"?>
<albums>
<album usuario="0669">
<capa src="meuPrimeiroAlbum.jpg"/>
<foto id="1" classificacao="5" src="umaFoto1.jpg"/>
<foto id="2" classificacao="5" src="umaFoto2.jpg"/>
<foto id="3" classificacao="4" src="umaFoto3.jpg"/>
<foto id="4" classificacao="2" src="umaFoto4.jpg"/>
<foto id="5" classificacao="1" src="umaFoto5.jpg"/>
<foto id="6" classificacao="2" src="umaFoto6.jpg"/>
</album>
<album usuario="1589">
<capa src="capas/umaCapa.jpg"/>
<foto id="1" classificacao="5" src="fotoDoUsuario1589.jpg"/>
<foto id="2" classificacao="2" src="fotoDoUsuario1589.png"/>
<foto id="3" classificacao="3" src="fotoDoUsuario1598.jpg"/>
</album>
</albums>
Agora temos 2 álbuns, de dois usuários diferentes, no caso é pouco, mais e neles que vamos trabalhar ..
Após o usuário se logar, ele tem que ter a possibilidade de ver os álbuns criados, alterar, é remover ..
tal foto, ou álbum, mais primeiro, temos que saber qual álbum é de quem .. sem isso não valeria de nada salvar
essas informações no XML para um fluxo de usuários usando seu sistema, pois você não teria como identificar
esses álbuns pra tal Usuário, então mãos a obra, vamos identificar qual álbum pertence a qual usuário, é montar um array com essas
informações retornadas após a consulta
Então, o XPath é uma linguagem para endereçar elementos de documentos XML
utiliza expressões de caminho define uma biblioteca de funções
publicada como W3C Recommendation em Novembro/1999
projetada para ser utilizada por XSLT, XPointer e outros parsers de XML
Então para o seguinte XML vou falar algumas coisas que sei sobre o XPath ..
Para o seguinte XML
<?xml version="1.0" encoding="utf-8"?>
<albums>
<album usuario="0669">
<capa src="meuPrimeiroAlbum.jpg"/>
<foto id="1" classificacao="5" src="umaFoto1.jpg"/>
<foto id="2" classificacao="5" src="umaFoto2.jpg"/>
<foto id="3" classificacao="4" src="umaFoto3.jpg"/>
<foto id="4" classificacao="2" src="umaFoto4.jpg"/>
<foto id="5" classificacao="1" src="umaFoto5.jpg"/>
<foto id="6" classificacao="2" src="umaFoto6.jpg"/>
</album>
<album usuario="1589">
<capa src="capas/umaCapa.jpg"/>
<foto id="1" classificacao="5" src="fotoDoUsuario1589.jpg"/>
<foto id="2" classificacao="2" src="fotoDoUsuario1589.png"/>
<foto id="3" classificacao="3" src="fotoDoUsuario1598.jpg"/>
</album>
</albums>
-
-
-
-
-
Caminho de localização, um passo consiste de:
-
um eixo: especifica o relacionamento, na árvore,entre o nó corrente e os nós selecionados pelo passo
-
um teste de nó: especifica um tipo de nó ou um nome de elemento para os nós a serem selecionados pelo passo
-
zero ou mais predicados:utilizam expressões para refinar o conjunto de nós selecionados pelo passo
-
Sintaxe de um passo eixo::testeDeNó[pedicados]
-
exemplo: child::valor[valor=1000]
Então, vemos o codigo
<?php
#Armazeno uma variavel com o ID pra tal usuário
$IDUsuario = 1589;
foreach( $DOMXPath->query(".//album[@usuario=".$IDUsuario."]/foto/parent::node()") as $Nodes ){
foreach( $Nodes->childNodes as $Node ){
echo 'Elemento (', $Node->nodeName, ')',' Attributo src = ', $Node->getAttribute('src'), '<br />';
}
}
Retorna
>
Elemento (capa) Attributo src = capas/umaCapa.jpg
Elemento (foto) Attributo src = fotoDoUsuario1589.jpg
Elemento (foto) Attributo src = fotoDoUsuario1589.png
Elemento (foto) Attributo src = fotoDoUsuario1598.jpg
Estamos selecionando o elemento album, onde o attributo usuario é igual a $IDUsuario, então avanço para tag foto, e seus parentes
Passando isso para um array, ficaria
<?php
#Armazeno uma variavel com o ID pra tal usuário
$IDUsuario = 1589;
foreach( $DOMXPath->query(".//album[@usuario=".$IDUsuario."]/foto/parent::node()") as $Nodes ){
foreach( $Nodes->childNodes as $Node ){
$FotosSRC[] = $Node->getAttribute('src');
$FotosID[] = $Node->getAttribute('id');
$FotosClassificacao[] = $Node->getAttribute('classificacao');
}
$Fotos[] = $FotosSRC;
$Id[] = $FotosID;
$classificacao[] = $FotosClassificacao;
}
echo '<pre>';
print_r( $Fotos );
print_r( $Id ) ;
print_r( $classificacao );
Retorna:
Array
(
[0] => Array
(
[0] => capas/umaCapa.jpg
[1] => fotoDoUsuario1589.jpg
[2] => fotoDoUsuario1589.png
[3] => fotoDoUsuario1598.jpg
)
) [0] => Array
(
[0] =>
[1] => 1
[2] => 2
[3] => 3
)
) [0] => Array
(
[0] =>
[1] => 5
[2] => 2
[3] => 3
)
)
Enfim .. por enquanto é só , vou dar mais exemplos na parte3 !
Aguardem ..