Leitura de XML – Parte 1 DOM XML
Postado por João Vagner em 09.12.2008 12:49 Desenvolvimento web, Internet, php
Já precisaram ler algum XML, de algum lugar, trabalhar com esses valores? Se ainda não precisaram, podem ter a absoluta convicção que esse dia chegará.
Alguns aplicativos ja usam o XML como transmissão de informações, ou recepção de informações. Importar ou exportar um arquivo XML é simples, fácil e rápido, basta manter um padrão para ler dentro de suas tags ou escrever dentro das mesmas.
Alguns sistemas, blogs, entre outros dispostivos, ja estão trabalhando totalmente ou parcialmente com XML, cada um usando formatações diferentes, porém a estrutura do arquivo sempre o mesmo com a marcação de tags, exemplo de um XML comum de RSS do nosso proprio blog TECHNÓCIL:
Nosso XML:
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 | <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" > <channel> <title>technocil.com</title> <atom:link href="http://technocil.com/feed/" rel="self" type="application/rss+xml" /> <link>http://technocil.com</link> <description></description> <pubDate>Tue, 09 Dec 2008 14:30:28 +0000</pubDate> <generator>http://wordpress.org/?v=2.6.5</generator> <language>en</language> <item> <title>Primeiro post, Apresentação…</title> <link>http://technocil.com/2008/12/09/primeiro-post-apresentacao/</link> <comments>http://technocil.com/2008/12/09/primeiro-post-apresentacao/#comments</comments> <pubDate>Tue, 09 Dec 2008 14:29:10 +0000</pubDate> <dc:creator>Tobias</dc:creator> <category><![CDATA[Geral]]></category> <category><![CDATA[Apresentacao]]></category> <category><![CDATA[Technócil]]></category> <guid isPermaLink="false">http://technocil.com/?p=121</guid> <description><![CDATA[nossa descrição do post [...]]]></description> <content:encoded><![CDATA[<p>Todo Conteudo do post</p> <p>Segundo paragrafo</p>]]></content:encoded> <wfw:commentRss>http://technocil.com/2008/12/09/primeiro-post-apresentacao/feed/</wfw:commentRss> </item> </channel> </rss> |
Um tanto quanto grande nosso XML né? Porém ele é ótimo para o exemplo devido aos niveis de title, e description, que irá nos exemplos abaixo.
Agora imaginem como ler ou obter os dados desse nosso RSS (XML). Para isso existem várias maneiras, algumas são usando algumas funções do PHP como a file_get_contents. Exemplo:
1 2 3 4 5 6 7 | <?php $conteudo = file_get_contents('http://technocil.com/feed/'); echo $conteudo; ?> |
Dependendo do seu navegador, o que será impresso é RSS(XML) do nosso blog, ou abrindo o código fonte do que for impresso, verá todo o XML impresso. No meu caso que uso o Opera, precisarei abrir o código fonte para ver o XML Impresso lá. Agora depois trabalhar com esses dados podem ser por expressão regular, e por ai vai, é um trabalhão dessa maneira. O XML não é dinamico, não pode ser interpretado pelo servidor, pode somente ser lido. Para escrever um XML com valores dinamicos sim, se usa usa PHP, e definindo no header o tipo de documento XML, porém ainda não chegamos ao ponto de escrever nenhum XML.
Então para fugir do trabalho duro e chato qual a maneira mais fácil e rápida de trabalhar com XML e seus valores?
São as mais conhecidas duas, usando uma extensão do php chamada DOM XML, que foi revisada no PHP 4.3.0 para trabalhar corretamente com o Padrão DOM, e segunda opção é a SimpleXML.
Instalação do DOM XML
A instalação é simples, basta descomentar a linha do php.ini que possui a extensão domxml.dll ou .so:
extension=php_domxml.dll
No meu caso, como uso o XAMPP 1.6.7, eu comentei a linha, pois a mesma apresentava um erro ao tentar utilizar, e eu apenas comentei e ela voltou a funcionar, no site do PHP Consta alguns avisos de versões, dependendo da sua versão do php, elas são válidas ou não:
Nota: Esta extensão foi movida para o repositório » PECL e não é mais distribuida em conjunto com o PHP a partir do PHP 5.0.0.
Nota: Esta extensão não está mais marcada como experimental. Ele será, contudo, nunca liberada com PHP 5, e irá somente ser distribuida com PHP 4. Se você precisa de suporte a DOM XML com PHP 5, você pode usar a extensão DOM. Esta extensão domxml não é compatível com a extensão DOM.
Alguns servidores web, porém tem dificuldade em trabalhar com essa biblioteca, um exemplo é a Locaweb (não vo divulgar o nome do cliente), que sofreu para que pudessem colocar esse componente tão simples no servidor. Mas isso vai de cliente a cliente. Eu aproveitando o gancho vou divulgar a IW² onde possui SVN (controle de versão), SSH e bibliotecas desses e outros usos liberadas, que hospeda aqui o TECHNOCIL.
Vamos aos códigos do DOM XML:
1 2 3 4 | //aqui iniciamos o trabalho com o DOM, definindo o cabeçalho como versão do XML 1.0, e trabalhando com o charset em UTF-8; $doc = new DOMDocument('1.0?', 'UTF-8?'); // aqui fazemos o load de todo o conteúdo do XML $doc->load('http://technocil.com/feed/'); |
Primeira fase completa, ja pegamos todo o conteudo do XML, ja iniciamos a extensão do DOM, e ja podemos usar os seus componentes:
1 2 3 | //exibe o titulo : technocil.com; pegando da tag title na raiz do XML: <title>technocil.com</title> $titulo = $doc->getElementsByTagName("title")->item(0)->nodeValue; echo $titulo ; |
Caso eu queira o titulo do post eu tenho que entrar dentro dos niveis do XML:
1 2 3 | // observe o item(1); Estamos trabalhando com niveis, parecidos com array, onde temos [0], [1], ['titulo']; $tituloPost = $doc->getElementsByTagName("title")->item(1)->nodeValue; echo $tituloPost ; |
Agora vamos pegar a descrição do Post:
1 2 3 | // observe que estamos ainda usando o item(1), ainda estamos em um segundo nivel das marcações $DescricaoPost = $doc->getElementsByTagName("description")->item(1)->nodeValue; echo $DescricaoPost ; |
Para ler esse conteudo dinamicamente, pode se trabalhar com foreach, listando nos ->item($i) um valor de listagem contando quantos posts possuem no XML. Agora é só brincarem ;)
Na parte dois, posto um exemplo de como pegar e trabalhar com os dados de Frete dos Correios, usando o XML de resposta das consultas por URL, e na parte 3, como trabalhar com o SimpleXML, no qual eu considero mais trabalhoso e chato.
Até mais!

