W3docs

Analizadores XML en PHP: Guía Completa

Aprende a analizar XML en PHP con SimpleXML, XMLReader y DOM. Ejemplos ejecutables, manejo de errores con libxml y cómo elegir el analizador adecuado.

XML (eXtensible Markup Language) es un formato ampliamente utilizado para intercambiar datos estructurados entre aplicaciones, servicios web y plataformas. Dado que muchas APIs, archivos de configuración y feeds todavía lo usan, saber cómo leer XML en PHP es una habilidad práctica. Esta guía explica los tres analizadores XML integrados que vienen con PHP — SimpleXML, XMLReader y DOM — muestra ejemplos ejecutables para cada uno y te ayuda a elegir el adecuado para tu caso de uso.

¿Qué es un analizador XML de PHP?

Un analizador XML es una biblioteca que lee un documento XML, verifica que esté bien formado y proporciona a tu código acceso estructurado a sus elementos, atributos y texto. PHP incluye tres analizadores nativos, todos construidos sobre el mismo motor subyacente libxml:

  • SimpleXML — un analizador basado en árbol que carga todo el documento en un objeto fácil de usar.
  • DOM — un analizador basado en árbol que sigue el W3C Document Object Model, con una API más rica para navegar y editar.
  • XMLReader — un analizador de streaming basado en cursor que lee un nodo a la vez sin cargar el documento completo en memoria.

"Basado en árbol" significa que todo el documento se mantiene en memoria como una estructura navegable — simple de usar pero consume mucha memoria para archivos grandes. "Streaming" (también llamado análisis por extracción) significa que el analizador recorre el documento nodo por nodo, lo que mantiene el uso de memoria bajo para archivos grandes.

Todos los ejemplos a continuación usan el mismo documento de muestra, incluido como string para que puedas ejecutarlos tal cual:

$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

SimpleXML ofrece la forma más rápida de leer XML. Cargas un documento en un objeto SimpleXMLElement y luego accedes a sus datos usando propiedades de objeto ordinarias — $xml->book[0]->title en lugar de llamadas a métodos. Es ideal para documentos pequeños o medianos cuya estructura ya conoces.

Usa simplexml_load_string() para XML que ya tienes como string, o simplexml_load_file() para leer directamente desde un archivo o 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";
}

Salida:

PHP for Beginners
PHP for Beginners by Jane Doe (2021)
Advanced PHP by John Smith (2023)

Ten en cuenta que los valores de los elementos son objetos SimpleXMLElement, no strings simples. La concatenación o echo los convierte a texto automáticamente, pero usa (string) cuando necesites un string real. Consulta PHP SimpleXML para un análisis más profundo, incluyendo la lectura de atributos y espacios de nombres.

XMLReader

XMLReader es un analizador de streaming unidireccional. En lugar de construir un árbol, avanza por el documento un nodo a la vez, por lo que la memoria se mantiene baja sin importar qué tan grande sea el archivo. Esto lo convierte en la opción correcta para feeds o exportaciones grandes donde cargar todo a la vez agotaría la memoria.

Llama a read() para avanzar al siguiente nodo, luego inspecciona nodeType y name para decidir qué hacer. Usa open() para leer desde un archivo o URL, o XML() para leer desde un string.

$reader = new XMLReader();
$reader->XML($xmlString);

while ($reader->read()) {
    if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'title') {
        echo $reader->readString() . "\n";
    }
}
$reader->close();

Salida:

PHP for Beginners
Advanced PHP

La contrapartida es la conveniencia: dado que XMLReader solo mantiene un nodo en cada momento, no hay acceso aleatorio — no puedes retroceder ni consultar elementos arbitrarios como puedes hacerlo con un árbol. Un patrón común es hacer streaming hasta el elemento que te interesa y luego pasar ese subárbol a SimpleXML o DOM con expand().

DOM

La extensión DOM implementa el estándar W3C Document Object Model. Al igual que SimpleXML, carga todo el documento en un árbol, pero expone una API más completa para navegar nodos, consultar con XPath y crear o modificar elementos. Recurre a DOM cuando necesites escribir o reestructurar XML, no solo leerlo.

Carga XML con loadXML() (desde un string) o load() (desde un archivo), luego recorre el árbol con métodos como getElementsByTagName().

$dom = new DOMDocument();
$dom->loadXML($xmlString);

$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
    echo $title->nodeValue . "\n";
}

Salida:

PHP for Beginners
Advanced PHP

getElementsByTagName() devuelve un DOMNodeList que puedes iterar o indexar con ->item(0). Para consultas más complejas puedes combinar DOMDocument con DOMXPath. Consulta PHP XML DOM para la API completa.

Manejo de errores de análisis

Por defecto, el XML malformado genera advertencias de PHP que son difíciles de manejar programáticamente. Llama a libxml_use_internal_errors(true) para suprimir esas advertencias y recopilar objetos de error estructurados con libxml_get_errors() en su lugar. Los tres analizadores comparten este mecanismo de errores de 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();
}

Salida:

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 1

Siempre verifica el valor de retorno de una función de carga (false en caso de fallo) antes de usar el resultado. Para más información sobre estos helpers, consulta PHP libxml.

Elegir el analizador XML de PHP adecuado

AnalizadorModeloMemoriaMejor para
SimpleXMLÁrbolAltaLecturas rápidas de documentos pequeños/medianos
DOMÁrbolAltaEdición, consultas XPath, construcción de XML
XMLReaderStreamingBajaDocumentos grandes leídos una vez, de arriba a abajo

En resumen:

  • Elige SimpleXML cuando solo quieras leer XML conocido de tamaño moderado con el mínimo código.
  • Elige DOM cuando necesites modificar documentos, ejecutar consultas XPath o generar XML.
  • Elige XMLReader cuando el documento sea lo suficientemente grande como para que cargarlo todo en memoria sea un problema.

Conclusión

PHP te ofrece tres analizadores XML nativos, cada uno adecuado para un trabajo diferente: SimpleXML para lecturas rápidas y simples, DOM para manipulación completa y XMLReader para streaming eficiente en memoria de archivos grandes. Adapta el analizador al tamaño de tu documento y a si solo necesitas leer o también escribir, envuelve las cargas en el manejo de errores de libxml y podrás analizar XML de forma fiable en cualquier proyecto PHP.

Para profundizar más, explora PHP SimpleXML parser, PHP XML parser (Expat) y PHP XML DOM.

Práctica

Práctica
¿Cuáles de estos son analizadores XML integrados de PHP cubiertos en esta guía?
¿Cuáles de estos son analizadores XML integrados de PHP cubiertos en esta guía?
Was this page helpful?