Leitura de XML – Parte 1 DOM XML
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!


09.12.08 16:08 at 04:08
Achei muito boa a iniciativa. Post tem realmente uma didática boa e com um conteudo que interessa a todos hoje em dia. Muito bom! Abraço
09.12.08 18:53 at 06:53
Olá Victor,
Obrigado por sua visita, e agradeço que esta gostando do blog, ainda essa semana irei postar exemplos mais uteis como calculo de frete, entre outras utilidades ;)
Abração
09.12.08 19:13 at 07:13
Olá!
Primeiramente, é um prazer conhecer o João Vagner, e um enorme desgosto saber que aquele viiiiiiiiado do Tobias aqui se encontra MWAHAHAHAHAH!!!
Bom, vou linkar ja ja vocês lá no meu blog, pois afinal, somos praticamente conhecidos de berçário (comecei um blog a uns dias).
Abraços e vamos penetrar 2009
(e o Tobias)com tudo!10.12.08 13:11 at 01:11
Pois é Thiago,
Infelizmente a sexualidade do Tobias nem ele decidiu. Porém isso não atrapalha o desenvolvimento dele. Eu acho né! hahahha
Obrigado pela visita e parabéns pelo seu novo filho! Iniciamos uma jornada ai praticamente quase que juntos.
10.12.08 18:23 at 06:23
hum, adorei o jeito com que você tão falando de mim ¬¬,
cambada de corno…
e Tykoth (hahahaha, acunha da bicha cabeluda que também atende por Tiago Bocchile) já tinha visitado seu filho a alguns dias e ta bem manero, retribuirei suas gentilezas assim que possível, tá…
10.12.08 20:20 at 08:20
E ai gente! Coloquei os Sr lá no blogroll do W2Y e também arrumei o nome de vosso blog no post sobre o Wp-Codebox, porém: é Technócio (como na URL) ou Tecnócio (como aqui: http://technocil.com/wp-content/themes/dailypress/images/logo.gif) MWAHAHAHA….
E ai Tobias?!
11.12.08 07:54 at 07:54
Thiago,
Creio que seu navegador esta com cache, pois o logo ja foi arrumado logo após agente ter lançado o blog.
Control + F5 resolve a questão ;)
11.12.08 10:49 at 10:49
hahahah, problemas de vísão meu garoto, hahahahaha, já tá “blogrollado” aqui tb fofa… fui
06.02.09 14:22 at 02:22
João… estou começando a mexer com PHP e XML DOM, algumas práticas mais simples como ler um elemento, imprimir seus filhos, utilizar funções como getAttribute, getElementsByTagName, etc… eu já consigo fazer algo, mas aí me veio a cabeça…
E se eu quisesse ler o elemento raiz sem saber o nome do elemento, ou seja, apenas jogar uma função que me retornasse a quantidade de filhos que o elemento Raiz possui, quantos atributos, quais são…. sem que houvesse que dizer getElementsByTagName(‘descrição’).
Mas alo que me trouxesse tudo… quantidade, valor… etc….
Existe algo do tipo em PHP?
abraços e valeu pela explicação!
Gabriel.
09.02.09 14:11 at 02:11
Gantuz,
Creio que sim, veja se é isso mesmo que precisa:
XML:
$xml = xmldocfile("exemplo.xml"); $root = $xmlDoc->root(); $teste = array_shift($root->children()); echo $teste->content;Veja se é isso mesmo que deseja.
;)