Conheça o Adianti Framework para PHP:

  • Desenvolvimento com componentes;
  • Formulários e datagrids.
  • Versão Web e Desktop (Gtk);
  • Multiplataforma;
  • Desenhe as interfaces;
  • IDE própria (Adianti Studio).
Ver detalhes...

Manipulando XML em PHP

Para prosseguir com o download do artigo, é necessário realizar login utilizando o Facebook ou Google. Este procedimento é totalmente seguro e nossa aplicação é certificada por ambos os serviços. Após a autenticação, você será direcionado de volta à nossa página para continuar o download.

Login com Facebook Login com Google

Resumo

Pablo Dall'Oglio Neste artigo iremos abordar um conjunto de funções chamadas de SimpleXML, que estão disponíveis a partir do PHP5. Seu objetivo, como diz seu nome, é tornar simples a tarefa de carregar, interpretar e alterar documentos XML. É de suma importância a manipulação de arquivos XML no desenvolvimento de aplicações, seja para o armazenamento de arquivos de configuração, de dados reais ou mesmo para o intercâmbio de informações entre diferentes aplicações. A seguir, abordaremos alguns exemplos práticos sobre carga e alteração de documentos XML, utilizando a extensão SimpleXML. Exemplos Primeiramente vamos realizar uma simples leitura de um documento XML e analisar seu retorno. Neste primeiro exemplo, tomamos o arquivo XML abaixo como base. No pequeno programa a seguir, iremos interpretar o documento XML através da função simplexml_load_file() e analisar o objeto resultante da sua criação, através da função var_dump(). Vemos claramente, cada tag do XML sendo transformada em propriedades do objeto resultante. Obs: A função simplexml_load_file() realiza a leitura de um documento XML, criando um objeto do tipo SimpleXmlElement apartir desta operação. Caso o documento for mal formatado, ou mesmo não for um documento XML, esta função retornará FALSE. paises.xml Brasil portugues catolica Real (R$) 190 milhoes exemplo1.php Resultado: object(SimpleXMLElement)#1 (5) { ["nome"]=> string(8) " Brasil " ["idioma"]=> string(11) " portugues " ["religiao"]=> string(10) " catolica " ["moeda"]=> string(11) " Real (R$) " ["populacao"]=> string(13) " 190 milhoes " } Um objeto SimpleXMLElement representa um elemento de um documento XML. Quando interpretado através das funções simplexml_load_file() ou simplexml_load_string(), o documento XML resulta em um objeto do tipo SimpleXMLElement, contendo seus atributos e valores, bem como outros objetos SimpleXMLElement internos, representando sub-elementos (nodos). Abaixo estão alguns dos métodos providos por um objeto do tipo SimpleXmlElement: asXML () Retorna uma string XMLformatada representando o objeto, bem como seus sub-elementos. attributes () Lista os atributos definidos dentro da tag XML do objeto. children () Retorna os elementos filhos do objeto (sub-nodos), bem como seus valores. addChild(string nome, string valor, string namespace) Adiciona um elemento ao nodo especificado e retorna um objeto do tipo SimpleXmlElement. Neste segundo exemplo, demonstraremos como acessar diretamente as propriedades do objeto SimpleXMLElement resultante da leitura do documento XML. Para tal, utilizamos o mesmo arquivo XML do exemplo anterior, imprimindo na tela as propriedades do objeto resultante com seu respectivo valor. exemplo2.php nome . "\n"; echo 'Idioma : ' . $xml->idioma . "\n"; echo 'Religiao : ' . $xml->religiao . "\n"; echo 'Moeda : ' . $xml->moeda . "\n"; echo 'População : '. $xml->populacao . "\n"; ?> Resultado: Nome : Brasil Idioma : portugues Religiao : catolica Moeda : Real (R$) População : 190 milhoes Você já viu como acessar diretamente as propriedades do XML sabendo os seus nomes. Neste terceiro exemplo, estaremos percorrendo o mesmo documento XML e imprimindo na tela suas propriedades (tags), mesmo sem saber os seus nomes. Isso é possível através da utilização do método children(), que atua sobre um objeto SimpleXMLElement e retorna todos os seus elementos filhos na forma de um array contendo a chave e o valor, que pode ser iterado por um laço FOREACH. exemplo3.php children() as $elemento => $valor) { echo "$elemento -> $valor\n"; } ?> Resultado: nome -> Brasil idioma -> portugues religiao -> catolica moeda -> Real (R$) populacao -> 190 milhoes paises2.xml Brasil português Brasília católica Real (R$) 190 milhoes tropical 7367 km Neblina (3014 m) Aperfeiçoamos um pouco nosso documento XML, adicionando uma seção "geografia", agrupando informações como clima, costa e pico. Neste caso, o objeto resultante ($xml), irá conter uma propriedade chamada "geografia", que é também um objeto do tipo SimpleXMLElement com suas respectivas propriedades, sendo passíveis da utilização dos mesmos métodos listados no início deste artigo (asXML(), children(), attributes(), etc...) exemplo4.php nome . "\n"; echo 'Idioma : ' . $xml->idioma . "\n"; echo "\n"; echo "*** Informações Geográficas ***\n"; echo 'Clima : ' . $xml->geografia->clima . "\n"; echo 'Costa : ' . $xml->geografia->costa . "\n"; echo 'Pico : ' . $xml->geografia->pico . "\n"; ?> Resultado: Nome : Brasil Idioma : português *** Informações Geográficas *** Clima : tropical Costa : 7367 km Pico : Neblina (3014 m) Você já aprendeu a acessar o XML de diversas formas, agora iremos ver como alterar o seu conteúdo. Neste caso, após a carga do documento, atribuímos novos valores acessando diretamente cada uma das propriedades que se deseja alterar no objeto. Também adicionamos um novo nodo, chamado "presidente", através do método addChild(). Após as atribuições de novos valores, utilizamos o método asXML() para retornar o novo documento XML formatado e atualizado. Caso quizermos sobrepor o arquivo original, basta utilizar a função file_put_contents(). exemplo5.php populacao = '220 milhoes'; $xml->religiao = 'cristianismo'; $xml->geografia->clima = 'temperado'; // adiciona novo nodo $xml->addChild('presidente', 'Chapolin Colorado'); // exibindo o novo XML echo $xml->asXML(); // grava no arquivo paises2.xml file_put_contents('paises2.xml', $xml->asXML()); ?> Resultado: Brasil português Brasília cristianismo Real (R$) 220 milhoes temperado 7367 km Neblina (3014 m) Chapolin Colorado paises3.xml Brasil português católica Real (R$) 190 milhoes tropical 7367 km Neblina (3014 m) Rio Grande do Sul São Paulo Minas Gerais Rio de Janeiro Paraná Mato Grosso Agora que você já aprendeu a alterar o conteúdo do XML, vamos ver como se dá o acesso à elementos repetitivos. Neste exemplo, adicionamos uma seção chamada , que contém uma listagem com nomes de estados. O código a seguir imprime na tela algumas informações do Documento XML, como nos exemplos anteriores e também mostra como exibir estes elementos repetitivos, através do laço de repetições foreach(). exemplo6.php nome . "\n"; echo 'Idioma : ' . $xml->idioma . "\n"; echo "\n"; echo "*** Estados ***\n"; /* Você pode acessar um estado diretamente pelo seu índice: echo $xml->estados->nome[0]; */ foreach ($xml->estados->nome as $estado) { echo 'Estado : ' . $estado . "\n"; } ?> Resultado: Nome : Brasil Idioma : português *** Estados *** Estado : Rio Grande do Sul Estado : São Paulo Estado : Minas Gerais Estado : Rio de Janeiro Estado : Paraná Estado : Mato Grosso paises4.xml Brasil português católica 190 milhoes tropical 7367 km Agora vamos complicar um pouco mais nosso arquivo XML. Este exemplo ilustra como trabalhar com elementos que contêm atributos na definição da própria tag (nome="Minas Gerais" capital="Belo Horizonte"). Para tal, alteramos a lista de estados para conter o "nome" e a "capital". Neste caso, as informações são retornadas em forma de array. Utilizando estruturas como o foreach() para percorrer a lista de estados, acessamos cada atributo do array de forma indexada, sendo o índice o próprio nome do atributo que desejamos acessar. Veja abaixo: exemplo7.php estados->estado as $estado) { // imprime o estado e a capital echo str_pad('Estado : ' . $estado['nome'], 30) . 'Capital: ' . $estado['capital'] . "\n"; } ?> Resultado: *** Estados *** Estado : Rio Grande do Sul Capital: Porto Alegre Estado : São Paulo Capital: São Paulo Estado : Minas Gerais Capital: Belo Horizonte Estado : Rio de Janeiro Capital: Rio de Janeiro Estado : Paraná Capital: Curitiba Estado : Mato Grosso Capital: Cuiabá Veja, que no exemplo anterior, é necessário saber exatamente o nome dos atributos que desejamos acessar, de forma indexada. Neste último exemplo, percorremos a lista de estados através de um foreach(), como no exemplo anterior, mas dentro deste laço de repetição, podemos percorrer os atributos de cada $estado (que é na verdade um objeto SimpleXMLElement) através do método attributes(), que retorna a chave e o valor de cada atributo de um elemento (nodo). exemplo8.php estados->estado as $estado) { // percorre os atributos de cada estado foreach ($estado->attributes() as $key => $value) { echo "$key=>$value\n"; } } ?> Resultado: *** Estados *** nome=>Rio Grande do Sul capital=>Porto Alegre nome=>São Paulo capital=>São Paulo nome=>Minas Gerais capital=>Belo Horizonte nome=>Rio de Janeiro capital=>Rio de Janeiro nome=>Paraná capital=>Curitiba nome=>Mato Grosso capital=>Cuiabá Sobre o Autor Pablo Dall'Oglio é autor de projetos em software livre reconhecidos como o Agata Report (http://agata.dalloglio.net) e do editor Tulip (http://tulip.dalloglio.net). É autor do primeiro livro sobre PHP-GTK no mundo (http://www.php-gtk.com.br/). É especialista em orientação a objetos, PHP e PHP-GTK. Pode ser contatado pelo e-mail pablo@php.net ou pablo@dalloglio.net.