W3docs

PHP SimpleXML - simplexml_load_file y simplexml_load_string

La extensión SimpleXML de PHP permite analizar y manipular datos XML fácilmente. Aprende a usar simplexml_load_file y simplexml_load_string.

Cómo obtener y leer XML con PHP SimpleXML

La extensión SimpleXML de PHP es la forma más rápida de leer y editar documentos XML. En lugar de recorrer un árbol de nodos manualmente, SimpleXML convierte todo el documento en un objeto PHP normal cuyos elementos se acceden con la sintaxis familiar de propiedades y arrays — $xml->title, $xml->item[0], $xml['id'].

Este capítulo cubre las dos funciones que se usan para cargar XML — simplexml_load_file() (para un archivo o URL) y simplexml_load_string() (para XML que ya tienes como string) — y cómo leer elementos, leer atributos, iterar sobre nodos repetidos, agregar nuevos datos y serializar el resultado de vuelta a XML.

SimpleXML viene incluido en la distribución estándar de PHP y está habilitado por defecto, por lo que generalmente no hay nada que instalar.

Cuándo usar SimpleXML (y cuándo no)

  • Usa SimpleXML para leer y editar ligeramente XML bien formado: archivos de configuración, feeds RSS/Atom, respuestas simples de API, sitemaps.
  • Recurre a DOMDocument cuando necesites control detallado: insertar nodos en una posición específica, trabajar con comentarios o validación de esquema.
  • Usa el Analizador XML (Expat) para documentos muy grandes que quieras procesar evento por evento sin cargar todo en memoria.

Cargar datos XML

El primer paso es obtener el XML en un objeto SimpleXML. Hay dos puntos de entrada, y cuál uses depende únicamente de dónde esté el XML en este momento.

Cargar un archivo XML con simplexml_load_file()

simplexml_load_file() lee XML desde una ruta local o una URL y devuelve un SimpleXMLElement. Si hay un error de análisis, devuelve false y emite una advertencia.

<?php

// books.xml on disk, or "https://example.com/feed.xml"
$xml = simplexml_load_file('books.xml');

if ($xml === false) {
    echo "Failed to load XML.";
} else {
    echo $xml->book[0]->title; // first <title>
}

Cargar un string XML con simplexml_load_string()

Cuando el XML ya está en una variable — por ejemplo, el cuerpo de una respuesta HTTP — usa simplexml_load_string() en su lugar.

php— editable, runs on the server

Ambas funciones devuelven el elemento raíz del documento, no un contenedor alrededor de él. En el ejemplo anterior, $xml es <root>, y $xml->child es el nodo <child> dentro de él.

Consejo: un SimpleXMLElement tiene un valor similar a un string pero sigue siendo un objeto. Envuélvelo en (string) (o concaténalo) siempre que necesites un string PHP puro — por ejemplo $title = (string) $xml->book[0]->title;. Consulta convertir SimpleXML a string para más detalles.

Acceder a los datos XML

Una vez cargado, puedes leer el documento con sintaxis de objeto y array.

Acceder a elementos

Los elementos hijo son propiedades del objeto. Cuando una etiqueta se repite, puedes indexarla como un array; [0] es la primera aparición.

<?php

$data = <<<XML
<library>
  <book><title>PHP Basics</title></book>
  <book><title>Advanced XML</title></book>
</library>
XML;

$xml = simplexml_load_string($data);

echo $xml->book[0]->title, "\n"; // PHP Basics
echo $xml->book[1]->title, "\n"; // Advanced XML

Iterar sobre elementos repetidos

Dado que las etiquetas repetidas se comportan como una lista iterable, foreach es la forma natural de leerlas todas:

<?php

$data = <<<XML
<library>
  <book><title>PHP Basics</title></book>
  <book><title>Advanced XML</title></book>
</library>
XML;

$xml = simplexml_load_string($data);

foreach ($xml->book as $book) {
    echo $book->title, "\n";
}
// PHP Basics
// Advanced XML

Acceder a atributos

Los atributos se acceden con sintaxis de array en el elemento que los contiene:

<?php

$xml = simplexml_load_string('<book id="42" lang="en"><title>PHP</title></book>');

echo $xml['id'], "\n";    // 42
echo $xml['lang'], "\n";  // en

Modificar datos XML

SimpleXML también puede construir y editar documentos en el lugar.

Agregar elementos

addChild() agrega un nuevo elemento y devuelve el elemento creado, por lo que puedes seguir encadenando llamadas:

<?php

$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');

echo $xml->child; // Value

Agregar atributos

addAttribute() añade un atributo al elemento sobre el que se llama:

<?php

$xml = simplexml_load_string('<root><child>Value</child></root>');
$xml->child->addAttribute('attribute', 'on');

echo $xml->child['attribute']; // on

Convertir SimpleXML de vuelta a XML

asXML() serializa el objeto de vuelta a un string XML (sin argumento) o lo escribe directamente en un archivo (cuando pasas una ruta). Es la manera de persistir los cambios realizados. Consulta el método asXML para más información.

<?php

$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');

echo $xml->asXML();
// <?xml version="1.0"?>
// <root><child>Value</child></root>

Manejar XML mal formado

Ante un fallo, estas funciones devuelven false y generan una advertencia, lo que es difícil de manejar. Convierte las advertencias en errores recopilables con libxml_use_internal_errors():

<?php

libxml_use_internal_errors(true);

$xml = simplexml_load_string('<root><child></root>'); // missing </child>

if ($xml === false) {
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message), "\n";
    }
    libxml_clear_errors();
}

Conclusión

SimpleXML es el camino más rápido desde un archivo XML o string hasta datos PHP legibles. Carga con simplexml_load_file() o simplexml_load_string(), lee elementos y atributos con sintaxis de propiedades y arrays, itera nodos repetidos con foreach, edita con addChild() y addAttribute(), y serializa de vuelta con asXML(). Para un procesamiento más complejo, pasa a DOMDocument; para transmitir archivos muy grandes, usa el Analizador XML.

Práctica

Práctica
¿Qué método usa la extensión SimpleXML de PHP para analizar el archivo XML?
¿Qué método usa la extensión SimpleXML de PHP para analizar el archivo XML?
Was this page helpful?