Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andrey Knupp Vital

[Resolvido] DOMDocument - XML { PHP }, Parte - 4

Recommended Posts

Bem, como na Parte 3

Já tínhamos falado de DOMXPath, e como se chega aos elementos através de uma query, podemos dar continuidade

ao que estávamos fazendo dês de a primeira aula, como já tínhamos parado com o XML dessa forma:

<?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>

 

Nele mesmo nos continuaremos, já que na parte 2 já achamos o álbum respectivo á um usuário

agora pensamos, e se esse 'usuário' deseja alterar uma foto ?, você reescreveria todo o XML ?

Isso pra mim seria uma perda de processamento, então tem outra forma de fazer isso ?

Alterar o valor do atributo 'src' de uma foto ?.

Claro que tem !!!!

 

Podiamos fazer assim ..

<?php
   $DOMDocument = new DOMDocument( '1.0', 'utf-8' );
   $DOMDocument->formatOutput = true;
   $DOMDocument->preserveWhiteSpace = false;
   $DOMDocument->loadXML( $XML );
   $DOMXPath = new DOMXPath( $DOMDocument );

   $idUsuario = '0669';
   $idFoto = 4;
   $DOMXPath->query( './/album[@usuario="'.$idUsuario.'"]/foto[@id="'.$idFoto.'"]' )
             ->item(0)->setAttribute( 'src', 'fotoAlterada.jpg' );

 

Percebam que na query, eu paro no elemento foto, não prossigo ou volto para um elemento anterior

Então se eu já estou na foto desejada, basta setar o attributo SRC novamente, Após executar esse código

o output do xml seria

<?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="fotoAlterada.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> 

 

Alteramos a foto com o 'id' 4 do XML, como também poderíamos remove-la de nossa galeria ..

<?php
   $DOMDocument = new DOMDocument( '1.0', 'utf-8' );
   $DOMDocument->formatOutput = true;
   $DOMDocument->preserveWhiteSpace = false;
   $DOMDocument->loadXML( $XML );
   $DOMXPath = new DOMXPath( $DOMDocument );

   $idUsuario = '0669';
   $idFoto = 4;
   $Foto = $DOMXPath->query( './/album[@usuario="'.$idUsuario.'"]/foto[@id="'.$idFoto.'"]' )->item(0);
   $Foto->parentNode->removeChild( $Foto );

 

Podemos ver que, $Foto retorna uma instância de DOMElement ..

Mais também, em DOMElement, que extende DOMNode, temos que andar pra trás pra poder pegar o node 'foto'

Por isso o uso do parentNode, porque aparentemente, item(0) nos leva ate o elemento 'foto' e seus filhos ..

mais nos não queremos seus filhos.. então voltando para o node Original, podemos remove-lo, apenas usando um removeChild( $Foto )

Após o código executado, o output séria

<?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="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> 

Percebam que não temos mais a foto de ID 4, isso poderia ser feito simplesmente com um formulário normal ..

Se você consegue extrair todo o XML em um array, percorrendo esse array você mode montar o html normalmente com as tags <img>

em um formulário com checkbox \ inputs para remover, alterar ..

Então é isso gente !

 

Até mais..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.