W3docs

PHP SimpleXML

SimpleXML es una extensión de PHP que ofrece una API sencilla para trabajar con documentos XML, permitiendo parsear y manipular XML fácilmente.

Introducción

SimpleXML es una extensión integrada de PHP que convierte un documento XML en un objeto que puedes recorrer con la sintaxis habitual de propiedades y arrays. En lugar de recorrer manualmente un árbol de nodos, escribes $xml->book->title — los nombres de los elementos se convierten en propiedades y los elementos repetidos en listas iterables.

Esto convierte a SimpleXML en la forma más rápida de leer un archivo de configuración, consumir una respuesta de una API XML o generar un documento XML pequeño. Esta página cubre la carga de XML, la lectura de elementos y atributos, el manejo de espacios de nombres, las consultas con XPath, la modificación de documentos y el tratamiento de errores de análisis.

SimpleXML es la mejor opción para documentos que caben cómodamente en memoria y tienen una estructura conocida y bastante plana. Para archivos muy grandes o un control más detallado y de bajo nivel, es preferible usar PHP XML DOM o el analizador XML basado en Expat.

Cargar un documento XML

Puedes construir un SimpleXMLElement a partir de tres fuentes:

  • simplexml_load_string() — analiza XML contenido en una cadena (útil para respuestas de API).
  • simplexml_load_file() — analiza XML almacenado en un archivo o URL.
  • new SimpleXMLElement($xml) — el constructor, que acepta una cadena de forma predeterminada.

Las tres devuelven un SimpleXMLElement que representa el elemento raíz del documento, no un envoltorio alrededor de todo el archivo. Así que si tu raíz es <library>, el objeto devuelto es <library>.

<?php

$data = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<library>
    <book category="fiction">
        <title>The Hobbit</title>
        <author>J.R.R. Tolkien</author>
        <price>14.99</price>
    </book>
    <book category="science">
        <title>A Brief History of Time</title>
        <author>Stephen Hawking</author>
        <price>18.50</price>
    </book>
</library>
XML;

$library = simplexml_load_string($data);
echo get_class($library); // SimpleXMLElement

Leer elementos y atributos

Los elementos hijo se acceden como propiedades. Cuando un elemento se repite (como <book>), la propiedad se comporta como una lista que puedes indexar con [] o recorrer con foreach. Los atributos se leen con acceso estilo array ($element['attr']).

<?php

$library = simplexml_load_string($data); // the XML from above

echo $library->book[0]->title . "\n";   // The Hobbit
echo count($library->book) . "\n";      // 2

foreach ($library->book as $book) {
    echo $book->title . " — " . $book['category'] . "\n";
}

Salida:

The Hobbit
2
The Hobbit — fiction
A Brief History of Time — science

Atención: un elemento accedido de esta forma es un SimpleXMLElement, no una cadena. $book->price se imprime como texto gracias a su método __toString(), pero para operaciones aritméticas o comparaciones estrictas, primero conviértelo: (float) $book->price o (string) $book['category']. Olvidar la conversión es el error más común en SimpleXML.

Consultas con XPath

Para cualquier cosa más allá de la navegación simple — filtrar, buscar en profundidad en el árbol, selección condicional — usa xpath(). Ejecuta una expresión XPath y devuelve un array de elementos coincidentes.

<?php

$library = simplexml_load_string($data);

// Titles of books priced over 10
foreach ($library->xpath('//book[price>10]/title') as $title) {
    echo $title . "\n";
}
// The Hobbit
// A Brief History of Time

Trabajar con espacios de nombres

Cuando un documento usa espacios de nombres XML, no puedes acceder a los elementos con prefijo mediante el acceso a propiedades simple — debes llamar a children() (para elementos) o attributes() (para atributos) con el URI del espacio de nombres, o registrar el prefijo antes de ejecutar XPath.

<?php

$rss = <<<XML
<rss xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <item>
            <title>Hello</title>
            <dc:creator>Jane Doe</dc:creator>
        </item>
    </channel>
</rss>
XML;

$xml = simplexml_load_string($rss);
$item = $xml->channel->item;

// Access the dc: namespace by URI
$dc = $item->children('http://purl.org/dc/elements/1.1/');
echo $dc->creator . "\n"; // Jane Doe

Modificar y crear XML

SimpleXML puede cambiar nodos existentes, añadir nuevos y serializar el resultado. Asigna a una propiedad para cambiar un valor, llama a addChild() para añadir un elemento y addAttribute() para añadir un atributo. asXML() devuelve el documento como una cadena, o lo escribe en un archivo si se le proporciona una ruta.

<?php

$book = simplexml_load_string('<book><title>Old Title</title><price>10.00</price></book>');

$book->title = 'New Title';            // change an existing value
$book->price = '12.50';
$book->addChild('author', 'Jane Doe'); // add a new element
$book->addAttribute('id', '42');       // add an attribute

echo $book->asXML();

Salida:

<?xml version="1.0"?>
<book id="42"><title>New Title</title><price>12.50</price><author>Jane Doe</author></book>

Pasar un nombre de archivo — $book->asXML('book.xml') — escribe el documento en disco en su lugar y devuelve true en caso de éxito. Consulta asXML() para la referencia completa.

Manejo de errores de análisis

Si el XML está mal formado, las funciones de carga devuelven false y emiten advertencias de PHP. Para capturar los errores de forma silenciosa e inspeccionarlos tú mismo, habilita el manejo interno de errores con libxml_use_internal_errors() y léelos con libxml_get_errors().

<?php

libxml_use_internal_errors(true);

$broken = "<library><book><title>Unclosed</book></library>";
$xml = simplexml_load_string($broken);

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 antes de usar el resultado — tratar un false como un objeto provoca errores de "attempt to read property on bool" más adelante.

Resumen

  • Carga XML con simplexml_load_string(), simplexml_load_file() o new SimpleXMLElement(); el objeto devuelto es el elemento raíz.
  • Lee los elementos hijo como propiedades y los atributos como claves de array; convierte a (string), (int) o (float) antes de comparar o calcular.
  • Usa xpath() para filtrar y hacer consultas profundas, y children()/attributes() con un URI para documentos con espacios de nombres.
  • Modifica con asignación de propiedades, addChild() y addAttribute(), luego serializa con asXML().
  • Protégete contra entradas mal formadas con libxml_use_internal_errors() y libxml_get_errors().

Para profundizar más, consulta Obtener valores de nodos con SimpleXML, la descripción general del analizador SimpleXML y las funciones libxml de bajo nivel.

Práctica

Práctica
¿Qué es PHP SimpleXML?
¿Qué es PHP SimpleXML?
Was this page helpful?