Parsers XML em PHP: Um Guia Completo
Aprenda a analisar XML em PHP com SimpleXML, XMLReader e DOM. Exemplos executáveis, tratamento de erros com libxml e como escolher o parser certo.
XML (eXtensible Markup Language) é um formato amplamente utilizado para troca de dados estruturados entre aplicações, serviços web e plataformas. Como muitas APIs, arquivos de configuração e feeds ainda o utilizam, saber como ler XML em PHP é uma habilidade prática. Este guia explica os três parsers XML nativos que acompanham o PHP — SimpleXML, XMLReader e DOM — mostra exemplos executáveis para cada um e ajuda você a escolher o mais adequado para seu caso de uso.
O que é um parser XML em PHP?
Um parser XML é uma biblioteca que lê um documento XML, verifica se ele está bem formado e fornece ao seu código acesso estruturado aos seus elementos, atributos e texto. O PHP inclui três parsers nativos, todos construídos sobre o mesmo motor subjacente libxml:
- SimpleXML — um parser baseado em árvore que carrega o documento inteiro em um objeto fácil de usar.
- DOM — um parser baseado em árvore que segue o W3C Document Object Model, com uma API mais rica para navegar e editar.
- XMLReader — um parser de streaming baseado em cursor que lê um nó por vez sem carregar o documento inteiro na memória.
"Baseado em árvore" significa que o documento inteiro é mantido na memória como uma estrutura navegável — simples de usar, mas consome muita memória para arquivos grandes. "Streaming" (também chamado de pull parsing) significa que o parser percorre o documento nó a nó, mantendo o uso de memória baixo para arquivos grandes.
Todos os exemplos abaixo usam o mesmo documento de amostra, mantido inline como string para que você possa executá-los diretamente:
$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>PHP for Beginners</title>
<author>Jane Doe</author>
<year>2021</year>
</book>
<book>
<title>Advanced PHP</title>
<author>John Smith</author>
<year>2023</year>
</book>
</library>
XML;SimpleXML
O SimpleXML oferece a forma mais rápida de ler XML. Você carrega um documento em um objeto SimpleXMLElement e então acessa seus dados usando propriedades de objeto comuns — $xml->book[0]->title em vez de chamadas de método. É ideal para documentos pequenos a médios cuja estrutura você já conhece.
Use simplexml_load_string() para XML que você já tem como string, ou simplexml_load_file() para ler diretamente de um arquivo ou URL.
$xml = simplexml_load_string($xmlString);
// Access a single value by position
echo $xml->book[0]->title . "\n";
// Loop over every <book> element
foreach ($xml->book as $book) {
echo "{$book->title} by {$book->author} ({$book->year})\n";
}Saída:
PHP for Beginners
PHP for Beginners by Jane Doe (2021)
Advanced PHP by John Smith (2023)Note que os valores dos elementos são objetos SimpleXMLElement, não strings simples. Concatenação ou echo os converte para texto automaticamente, mas use (string) quando precisar de uma string de verdade. Veja PHP SimpleXML para uma análise mais aprofundada, incluindo leitura de atributos e namespaces.
XMLReader
O XMLReader é um parser de streaming que avança apenas para frente. Em vez de construir uma árvore, ele avança pelo documento um nó por vez, mantendo a memória baixa independentemente do tamanho do arquivo. Isso o torna a escolha certa para feeds ou exportações grandes onde carregar tudo de uma vez esgotaria a memória.
Chame read() para avançar para o próximo nó, depois inspecione nodeType e name para decidir o que fazer. Use open() para ler de um arquivo ou URL, ou XML() para ler de uma string.
$reader = new XMLReader();
$reader->XML($xmlString);
while ($reader->read()) {
if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'title') {
echo $reader->readString() . "\n";
}
}
$reader->close();Saída:
PHP for Beginners
Advanced PHPA desvantagem é a conveniência: como o XMLReader mantém apenas um nó por vez, não há acesso aleatório — você não pode voltar ou consultar elementos arbitrários como faria com uma árvore. Um padrão comum é fazer o streaming até o elemento desejado e então passar essa subárvore para o SimpleXML ou DOM com expand().
DOM
A extensão DOM implementa o W3C Document Object Model padrão. Assim como o SimpleXML, ela carrega o documento inteiro em uma árvore, mas expõe uma API mais completa para navegar nos nós, consultar com XPath e criar ou modificar elementos. Use DOM quando precisar escrever ou reestruturar XML, não apenas lê-lo.
Carregue XML com loadXML() (de uma string) ou load() (de um arquivo), e depois percorra a árvore com métodos como getElementsByTagName().
$dom = new DOMDocument();
$dom->loadXML($xmlString);
$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
echo $title->nodeValue . "\n";
}Saída:
PHP for Beginners
Advanced PHPgetElementsByTagName() retorna um DOMNodeList que você pode iterar ou indexar com ->item(0). Para consultas mais complexas, você pode combinar DOMDocument com DOMXPath. Veja PHP XML DOM para a API completa.
Tratamento de erros de análise
Por padrão, XML malformado dispara avisos PHP difíceis de tratar programaticamente. Chame libxml_use_internal_errors(true) para suprimir esses avisos e coletar objetos de erro estruturados com libxml_get_errors(). Todos os três parsers compartilham esse mecanismo de erros do libxml.
libxml_use_internal_errors(true);
$badXml = '<library><book><title>Unclosed</book></library>';
$xml = simplexml_load_string($badXml);
if ($xml === false) {
echo "Failed to parse XML:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message) . "\n";
}
libxml_clear_errors();
}Saída:
Failed to parse XML:
Opening and ending tag mismatch: title line 1 and book
Opening and ending tag mismatch: book line 1 and library
Premature end of data in tag library line 1Sempre verifique o valor de retorno de uma função de carregamento (false em caso de falha) antes de usar o resultado. Para mais informações sobre esses auxiliares, veja PHP libxml.
Escolhendo o parser XML PHP certo
| Parser | Modelo | Memória | Melhor para |
|---|---|---|---|
| SimpleXML | Árvore | Alta | Leituras rápidas de documentos pequenos/médios |
| DOM | Árvore | Alta | Edição, consultas XPath, construção de XML |
| XMLReader | Streaming | Baixa | Documentos grandes lidos uma vez, de cima para baixo |
Em resumo:
- Escolha SimpleXML quando quiser apenas ler XML conhecido e de tamanho moderado com o mínimo de código.
- Escolha DOM quando precisar modificar documentos, executar consultas XPath ou gerar XML.
- Escolha XMLReader quando o documento for grande o suficiente para que carregá-lo todo na memória seja um problema.
Conclusão
O PHP oferece três parsers XML nativos, cada um adequado para uma tarefa diferente: SimpleXML para leituras rápidas e simples, DOM para manipulação completa, e XMLReader para streaming eficiente em memória de arquivos grandes. Combine o parser ao tamanho do seu documento e se você precisa apenas ler ou também escrever, envolva os carregamentos com tratamento de erros do libxml, e você poderá analisar XML de forma confiável em qualquer projeto PHP.
Para ir além, explore PHP SimpleXML parser, PHP XML parser (Expat) e PHP XML DOM.