No PHP existem três mecanismos para tratarmos com XML: o Simple API for XML (SAX), o PHP5 Document Object Model (DOM) e a biblioteca SimpleXML.
Hoje decidi listar rapidamente os ônus e bônus de cada opção. Vamos lá!
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. Em outras palavras, é 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, o parsing acontece por trás dos bastidores e na maioria das vezes nem sequer notemos. Entretanto, é com ele que é checado 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 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.”
PHP 5 Power Programing
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:
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 !