W3docs

SimpleXML en PHP: Una guía completa

SimpleXML es una potente herramienta en PHP para analizar y manipular datos XML. Aprende a usarla con ejemplos prácticos.

SimpleXML es una extensión de PHP integrada que convierte un documento XML en un árbol de objetos que puedes leer, recorrer y modificar con la sintaxis ordinaria de PHP. Este tutorial cubre la carga de XML, la lectura de elementos y atributos, el manejo de espacios de nombres, la modificación de nodos y la escritura del resultado — con ejemplos ejecutables y los errores más comunes.

Introducción a SimpleXML

SimpleXML es una extensión de PHP que permite analizar y manipular datos XML con muy poco código. Es diferente de la extensión DOM, pero ambas se apoyan en la misma biblioteca libxml2, por lo que comparten su manejo de errores. La elección entre una u otra es simple:

  • SimpleXML — ideal para leer XML bien formado donde principalmente recorres una estructura conocida. Acceso conciso, similar a objetos.
  • DOM — mejor para edición intensiva, mover nodos o cuando necesitas control total sobre el árbol del documento.

SimpleXML está habilitado por defecto en las instalaciones estándar de PHP, por lo que normalmente no hay nada que instalar.

Carga de XML

Hay dos puntos de entrada. Usa simplexml_load_file() para un archivo o URL, y simplexml_load_string() para XML que ya tienes en una cadena (por ejemplo, una respuesta de API).

Como ambas funciones dependen de libxml2, un documento mal formado produce advertencias de PHP y devuelve false. Cambia siempre al manejo interno de errores primero con libxml_use_internal_errors() para poder inspeccionar los errores tú mismo en lugar de filtrar advertencias a la salida:

Carga de un archivo XML

libxml_use_internal_errors(true);

$xml = simplexml_load_file('data.xml');
if ($xml === false) {
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message), PHP_EOL;
    }
    die('Failed to load XML.');
}

simplexml_load_string() funciona de manera idéntica pero recibe el texto XML directamente:

Carga de XML desde una cadena

$source = '<data><item><name>John Doe</name></item></data>';
$xml = simplexml_load_string($source);

En ambos casos, el valor de retorno es un SimpleXMLElement que representa el elemento raíz del documento.

Acceso a Elementos

SimpleXML mapea cada elemento hijo a una propiedad del objeto padre, accesible con el operador de objeto de PHP -> (no notación de punto — PHP no tiene acceso a miembros con .). Los elementos hijo repetidos se direccionan por índice. Considera este XML:

Ejemplo de XML

<data>
  <item>
    <name>John Doe</name>
    <age>30</age>
  </item>
  <item>
    <name>Jane Doe</name>
    <age>28</age>
  </item>
</data>

Lee el primer elemento y luego recorre todos los item con foreach:

Acceso a valores de elementos

// The first <item> (index 0)
$name = $xml->item[0]->name;
$age  = $xml->item[0]->age;

// Iterate through all <item> elements
foreach ($xml->item as $item) {
    echo $item->name . ' is ' . $item->age . ' years old.' . PHP_EOL;
}

El problema con la conversión a string

$item->name no es una cadena — es un SimpleXMLElement. Solo parece una cadena cuando se imprime porque el elemento se convierte automáticamente en contextos de cadena. Si lo almacenas en un array, lo pasas a json_encode() o lo comparas estrictamente, conviértelo explícitamente primero:

$name = (string) $xml->item[0]->name;   // plain string
$age  = (int)    $xml->item[0]->age;     // plain int

Lectura de Atributos

Los atributos de los elementos se acceden con sintaxis de array, no con el operador ->. Dado <item id="1" status="active">, léelos así:

Acceso a atributos

$id     = (string) $xml->item[0]['id'];      // "1"
$status = (string) $xml->item[0]['status'];  // "active"

// Loop over every attribute on an element
foreach ($xml->item[0]->attributes() as $key => $value) {
    echo "$key = $value" . PHP_EOL;
}

Trabajo con Espacios de Nombres

El XML que usa espacios de nombres (prefijos como <atom:link>) no se resolverá con acceso directo a propiedades — debes registrar el espacio de nombres con children() o usar una consulta XPath. Esta es la razón más común por la que "el elemento está vacío" aunque claramente esté en el archivo:

Elementos con espacio de nombres

$source = '<feed xmlns:atom="http://www.w3.org/2005/Atom">'
        . '<atom:title>Hello</atom:title></feed>';
$xml = simplexml_load_string($source);

$atom  = $xml->children('http://www.w3.org/2005/Atom');
echo (string) $atom->title;   // "Hello"

Consultas con XPath

Para cualquier cosa más profunda que un hijo directo, xpath() devuelve un array de elementos coincidentes — mucho más limpio que anidar bucles:

// Every <name> anywhere under the root
foreach ($xml->xpath('//name') as $name) {
    echo (string) $name . PHP_EOL;
}

Modificación y Adición de Elementos

Puedes cambiar un valor asignando a la propiedad, y ampliar el árbol con addChild() / addAttribute():

Modificación y construcción de nodos

// Change existing values
$xml->item[0]->name = 'John Smith';
$xml->item[0]->age  = 32;

// Add a brand-new child element and an attribute
$new = $xml->addChild('item');
$new->addChild('name', 'New Person');
$new->addAttribute('id', '99');

Asignar un valor reemplaza el contenido de texto del elemento; addChild() agrega un nuevo elemento en lugar de sobrescribir uno existente.

Conversión de Vuelta a XML

Usa el método asXML() para serializar el árbol (posiblemente modificado) de vuelta a una cadena, luego escríbela con file_put_contents():

Guardar los cambios de vuelta a XML

file_put_contents('data.xml', $xml->asXML());

Llamado sin argumento, asXML() devuelve el documento completo como una cadena incluyendo la declaración <?xml version="1.0"?> — exactamente lo que necesitas para guardar. Llámalo sobre un elemento hijo ($xml->item[0]->asXML()) para obtener solo ese fragmento, sin la declaración.

Conclusión

SimpleXML es la forma más rápida de leer y editar levemente XML bien formado en PHP: carga con simplexml_load_file() o simplexml_load_string(), recorre el árbol con -> e indexación de arrays, lee atributos con [], y serializa de vuelta con asXML(). Recuerda los dos problemas recurrentes — convierte los elementos a cadenas antes de reutilizarlos, y registra los espacios de nombres antes de acceder a nodos con prefijo. Para edición programática y a gran escala de documentos, usa la extensión DOM en su lugar. Para profundizar, continúa con PHP SimpleXML y lectura de datos con SimpleXML get.

Práctica

Práctica
¿Qué hace la extensión SimpleXML en PHP?
¿Qué hace la extensión SimpleXML en PHP?
Was this page helpful?