Tratando-se de PHP, existem basicamente três mecanismos para tratarmos com XML : com o Simple API for XML (SAX), o PHP5 Document Object Model (DOM) e a biblioteca SimpleXML. Entendo que já existem diversos sites explicando como utilizar cada uma das três técnicas, mas procurando na web eu não achei nenhum site que liste rápidamente seus ônus e bônus, logo não fiz um passo-a-passo mas sim uma resenha das extensões.
Antes de tudo : entendendo o conceito de parsing de um XML
Todos os mecanismos que trabalham com XML no PHP obrigatoriamente usam o conceito de parsing, onde é feita uma análise da estrutura do documento para então começar desencadear ações para nos permitir trabalhar com o mesmo. Também conhecida na ciência da computação como Análise Sintática, por mais que o parsing aconteça por trás dos bastidores e na maioria das vezes nem sequer notemos, ele sempre irá checar se o documento fornecido é um documento XML válido. Alguns links interessantes:
W3Schools : Well formated XML
Wikipedia: Valid XML
Wikipedia (PT) - Análise Sintática
PHP SAX
O SAX trabalha sempre com o lançamento de eventos que estouram de acordo com os elementos encontrados no XML - essencialmente sendo esses as tags de abertura e fechamento, mas podendo ser definidos outros padrões. Para trabalhar com SAX, você basicamente cria um parser para o XML com a função chamada xml_parser_create e depois começa a usar o handler criado sentando suas funções que estourarão de acordo com os elementos encontrados. Sendo sincero, a idéia até é legal, mas só vale a pena se realmente manipular cada (ou a maioria) dos elementos do seu XML. O próprio Andi Gutmans confessa que dá muito trabalho usar o SAX.
Quanto ao seu desempenho, é satisfatório para aplicações online de grande porte. Dizem os evangelistas do PHP5 que nesta última versão do PHP o SAX teve um improvement de desempenho devido a troca do mecanismo de base para rotinas com XML, que antigamente era uma toolkit em C chamada Expat e agora é a criada pela galera do Gnome, a chamada libxml2. Eu não vi nenhum benchmark na web falando sobre isso.
Links interessantes sobre SAX:
PHP.NET - XML parser options
InformIT - SAX and PHP
PHP DOM
Já o PHP DOM, por sua vez, veio com o PHP trazendo algumas facilidades. O Zend PHP 5 Certification Study Guide chega a dizer que ele foi totalmente reescrito. Mas fique atento: o próprio Andi Gutmans no livro PHP 5 Power Programing canta a pedra de que a extensão DOM come memória feito um cão. Ele diz na p. 147 :
"Usar o método DOM é muito mais fácil ( em relação ao Sax - simple API for XML), mas paga-se um preço - uso de memória. Embora isso não seja perceptível em um pequeno exemplo, definitivamente é perceptível quando você faz o parsing de um arquivo XML de 20mb com o método DOM. Ao invés de iniciar eventos para cada elemento de arquivo XML, o DOM cria um árvore na memória contendo o seu arquivo XML."
Por isso fique atento quando utilizar o DOM, pois se você carregar um XML robusto para cada usuário que se loga no seu site, por exemplo, você poderá ter um sério problema. Ainda sim o DOM parece ser a técnica mas completa para fazer o parsing do seu documento XML. Quando você tem a extensão DOM já compilada com seu PHP, basta você instanciar a classe DomDocument - que já vem junto com a extensão, e usar o método load() caso tenha que ler um arquivo xml do seu HD. Ele também suporta o uso de XPath (linguagem de consulta para XML). Por último, destaco também que o DOM e o SimpleXML (próxima técnica) tem uma boa comunicação através dos seus handles, podendo ser feita a conversão de um handle de um tipo para outro com grande facilidade.
Links interessantes sobre DOM:
PHP.NET - Document Object Model
W3Schools - PHP XML DOM
SimpleXML
Por última (e também mais usada) existe a extensão SimpleXML, que oferece uma ampla variedade de opções para operações com XML. Embora tenha algumas limitações, na maioria dos casos a SimpleXML é a mais indicada - devido sua simplicidade e bom desempenho. Ler, comparar e substituir nós e retirar textos de um XML com o SimpleXML é rápido e indolor, ao contrário das duas últimas extensões.
Nas primeiras subversões do PHP5, o SimpleXML não tinha o recurso de escrita de um XML, somente leitura e busca. Mas essa limitação já foi sanada embora outra limitação ainda exista: a de remoção de atributos de um nó. Ou você retira o nó e insere outro já sem o atributo desejado, ou você exporta seu handler do SimpleXML para o DOM, retira o atributo e retorna para o SimpleXML.
Links interessantes sobre o SimpleXML:
PHP.NET - SimpleXML
W3Schools - PHP SimpleXML
O'Reilly On Lamp - Using PHP5 SimpleXML
Dei essa pincelada nas formas mais comuns de lidar com XML no PHP mas saiba que existem outras formas menos convencionais - e bem mais rústicas, como fazer o parser de um XML com expressões regulares. Vamos ver o que o PHP6 pode vir a acrescentar sobre esse aspecto. Vlw !
2 comentários:
Comecei a estudar o trabalho de PHP com XML e este seu artigo caiu como luvas. Obrigado pela postagem.
Na sua opnião, para tratamentos de pequenos XML vale a pena o DOM?
Sempre que possível use o SimpleXML - é o mais usado pela comunidade, portanto, sempre você encontrará material pela web e pessoas que podem te dar uma força.
Vlw!
PM
Postar um comentário