Aprenda como ler arquivos XML com PHP
Nesse post vou demonstrar como podemos ler arquivos XML com PHP de maneira bem simples. É muito comum nos dias atuais aplicações PHP se comunicarem com diversos tipos de APIs e Web Services espalhados pela WEB.
Grande parte dessa troca de informações entre diferentes plataformas ocorre graças aos arquivos no formato XML, esse é um dos motivos que torna a leitura de arquivos XML tão importante para aplicações PHP.
Outros posts sobre PHP que podem interessar:
Requisições com a biblioteca cURL no PHP
PHP diferença entre Aspas e Apóstrofos
PHP 7 – Liberado primeira versão Alpha | Dica
O que significa XML?
“XML (eXtensible Markup Language) é uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais.
É um dos subtipos da SGML (acrônimo de Standard Generalized Markup Language ou Linguagem Padronizada de Marcação Genérica) capaz de descrever diversos tipos de dados. Seu propósito principal é a facilidade de compartilhamento de informações através da internet.” Fonte: Wikipédia
Exemplo do formato XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="UTF-8"?> <clientes> <cliente> <codigo>001</codigo> <nome>João</nome> <email>joao@email.com</email> <celular>3333-3333</celular> </cliente> <cliente> <codigo>002</codigo> <nome>Pedro</nome> <email>pedro@email.com</email> <celular>4444-4444</celular> </cliente> </clientes> |
Ler arquivos XML com PHP
O PHP fornece muita facilidade para esse tipo de necessidade, disponibilizando 2 funções nativas para leitura de arquivos XML e uma classe para leitura de XML com Namespaces:
Função simplexml_load_file()
Ler arquivos XML com PHP utilizando a função simplexml_load_file() é bem simples, ela recebe um parâmetro que é o caminho (path) para um arquivo XML e transforma esse conteúdo em objeto.
Vou demonstrar como funciona, para esse exemplo montei um arquivo XML com o nome vendas.xml, simulando 2 vendas com dados do cliente e dos produtos vendidos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version='1.0' encoding='UTF-8'?> <vendas> <titulo>Arquivo de Venda</titulo> <data_atualizacao>22/08/2015</data_atualizacao> <venda> <cod_venda>001</cod_venda> <cliente>João</cliente> <email>joao@email.com</email> <itens> <item> <cod_produto>909</cod_produto> <qtde>12</qtde> <descricao>Produto 1</descricao> </item> <item> <cod_produto>910</cod_produto> <qtde>34</qtde> <descricao>Produto 2</descricao> </item> </itens> </venda> <venda> <cod_venda>002</cod_venda> <cliente>Pedro</cliente> <email>pedro@email.com</email> <itens> <item> <cod_produto>300</cod_produto> <qtde>15</qtde> <descricao>Produto 3</descricao> </item> <item> <cod_produto>304</cod_produto> <qtde>19</qtde> <descricao>Produto 4</descricao> </item> </itens> </venda> </vendas> |
Agora usando a função simplexml_load_file() vou transformar esse conteúdo em objeto e percorrer os registros com foreach().
Alguns pontos que merecem destaque, podemos acessar tags que estão na raiz do XML apenas chamando $xml->titulo. Com o foreach() percorremos as vendas e para cada iteração atribuo os dados da venda para variável $registro, desse modo basta acessar $registro->nome_tag e quando chegamos na tag itens basta efetuar outro foreach() sobre os itens da venda atual.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php // Transformando arquivo XML em Objeto $xml = simplexml_load_file('vendas.xml'); // Exibe as informações do XML echo 'Título: ' . $xml->titulo . '<br>'; echo 'Data de Atualização: ' . $xml->data_atualizacao . '<br>'; // Percorre todos os registros de vendas foreach($xml->venda as $registro): echo 'Código da Venda: ' . $registro->cod_venda . '<br>'; echo 'Cliente: ' . $registro->cliente . '<br>'; echo 'Email: ' . $registro->email . '<br>'; // Percorre todos os itens da venda foreach($registro->itens->item as $item): echo 'Código do Produto: ' . $item->cod_produto . '<br>'; echo 'Quantidade: ' . $item->qtde . '<br>'; echo 'Descrição do Produto: ' . $item->descricao . '<br>'; endforeach; echo '<hr>'; endforeach; |
Função simplexml_load_string()
A função simplexml_load_string() é mais uma das facilidades que temos para ler arquivos XML com PHP, ela é muito similar a função simplexml_load_file() porém recebe como parâmetro uma string contendo um XML e transforma em objeto.
No exemplo abaixo simplesmente atribui o mesmo conteúdo do arquivo XML apresentando no exemplo anterior e atribui para variável $string, posteriormente passei essa variável como parâmetro para função simplexml_load_string(), o restante da lógica de leitura é a mesma.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?php // Atribui o conteúdo XML para variável $string = "<?xml version='1.0' encoding='UTF-8'?> <vendas> <titulo>Arquivo de Venda</titulo> <data_atualizacao>22/08/2015</data_atualizacao> <venda> <cod_venda>001</cod_venda> <cliente>João</cliente> <email>joao@email.com</email> <itens> <item> <cod_produto>909</cod_produto> <qtde>12</qtde> <descricao>Produto 1</descricao> </item> <item> <cod_produto>910</cod_produto> <qtde>34</qtde> <descricao>Produto 2</descricao> </item> </itens> </venda> <venda> <cod_venda>002</cod_venda> <cliente>Pedro</cliente> <email>pedro@email.com</email> <itens> <item> <cod_produto>300</cod_produto> <qtde>15</qtde> <descricao>Produto 3</descricao> </item> <item> <cod_produto>304</cod_produto> <qtde>19</qtde> <descricao>Produto 4</descricao> </item> </itens> </venda> </vendas>"; // Transformando o conteúdo XML da variável $string em Objeto $xml = simplexml_load_string($string); // Exibe as informações do XML echo 'Título: ' . $xml->titulo . '<br>'; echo 'Data de Atualização: ' . $xml->data_atualizacao . '<br>'; // Percorre todos os registros de vendas foreach($xml->venda as $registro): echo 'Código da Venda: ' . $registro->cod_venda . '<br>'; echo 'Cliente: ' . $registro->cliente . '<br>'; echo 'Email: ' . $registro->email . '<br>'; // Percorre todos os itens da venda foreach($registro->itens->item as $item): echo 'Código do Produto: ' . $item->cod_produto . '<br>'; echo 'Quantidade: ' . $item->qtde . '<br>'; echo 'Descrição do Produto: ' . $item->descricao . '<br>'; endforeach; echo '<hr>'; endforeach; |
Classe SimpleXMLElement
A classe SimpleXMLElement possui vários métodos e com ela podemos ler arquivos XMLs contendo Namespaces, após instanciar o objeto é necessário alguns passos para efetuar a leitura do arquivo XML, temos que capturar os Namespaces existentes e os respectivos elementos filhos para cada Namespace, por fim percorrer com foreach() os elementos capturados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php // Atribui o conteúdo XML para variável $string = <<<XML <?xml version="1.0" encoding="UTF-8"?> <clientes xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test"> <p:cliente id="1">João</p:cliente> <p:cliente id="2">Pedro</p:cliente> </clientes> XML; // Instância o objeto SimpleXMLElement passando como parâmetro o XML $xml = new SimpleXMLElement($string); // Retorna os Namespaces existentes no XML $ns = $xml->getNamespaces(true); // Retorna todos os elementos filhos com Namespace 'p' $child = $xml->children($ns['p']); // Percorre os elementos filhos foreach ($child->cliente as $elemento): echo $elemento . '<br>'; endforeach; |
Bom pessoal nesse post demonstrei como ler arquivos XML com PHP utilizando funções e classes nativas. Já desenvolvi em outras linguagens e sem dúvida o PHP é a linguagem que mais oferece facilidade para leitura de XMLs, mesmo os arquivos com Namespaces possuem pouca complexidade para leitura.
Se você gostou desse post compartilhe nas redes sociais, até a próxima …