simplexml_import_dom()
SimpleXML es una extensión de PHP que ofrece una API sencilla para trabajar con documentos XML. Aprende a usar simplexml_import_dom() con ejemplos.
Introducción
PHP ofrece dos formas distintas de manejar XML: la extensión DOM, que es potente y cumple con los estándares pero es verbosa, y SimpleXML, que sacrifica algo de esa potencia a cambio de una API mucho más amigable basada en propiedades de objetos. simplexml_import_dom() es el puente entre ambas: toma un nodo de un árbol DOM y te devuelve un SimpleXMLElement que envuelve los mismos datos.
Esto es útil cuando has realizado trabajo pesado con DOM (validando contra un esquema, usando XPath, manipulando espacios de nombres) pero quieres leer el resultado con la sintaxis concisa de SimpleXML. Esta página explica cómo funciona la función, cuándo usarla y los problemas más comunes.
Sintaxis
simplexml_import_dom(
object $node,
?string $class_name = SimpleXMLElement::class
): SimpleXMLElement|null$node— el nodo DOM a importar. En la práctica es una instancia deDOMNode,DOMElementoDOMDocument. Si pasas unDOMDocument, se importa su elemento documento (la raíz).$class_name— una clase opcional que extiendeSimpleXMLElement. El objeto devuelto es una instancia de esta clase, lo que te permite añadir tus propios métodos auxiliares.
Devuelve un SimpleXMLElement en caso de éxito, o null si el nodo no pudo importarse. La función está disponible desde PHP 5.1.3.
Importar un documento completo
El caso más habitual es analizar o construir un documento con DOM y luego pasar la raíz a SimpleXML para una lectura sencilla:
<?php
$dom = new DOMDocument();
$dom->loadXML('<?xml version="1.0"?>
<book>
<title>PHP Basics</title>
<author>Jane Doe</author>
</book>');
$book = simplexml_import_dom($dom);
// Read with SimpleXML's property syntax instead of DOM method calls:
echo $book->title; // PHP Basics
echo "\n";
echo $book->author; // Jane Doe
?>Pasar el objeto $dom (un DOMDocument) importa su elemento raíz, por lo que $book corresponde a <book>. Compara esto con el equivalente en DOM — $dom->getElementsByTagName('title')->item(0)->nodeValue — y la ventaja de SimpleXML queda clara.
Importar un único elemento creado programáticamente
También puedes construir un nodo con DOM e importar solo ese nodo:
Aquí creamos un elemento <title>, lo adjuntamos al documento y pasamos el elemento raíz del documento ($dom->documentElement) a simplexml_import_dom(). asXML() serializa luego el SimpleXMLElement de vuelta a una cadena de texto.
Relación con el resto de la API de SimpleXML
simplexml_import_dom() es la inversa de dom_import_simplexml(), que convierte un SimpleXMLElement de vuelta en un DOMElement. Juntas permiten moverse libremente entre las dos extensiones:
| Tienes | Quieres | Usa |
|---|---|---|
| Un nodo DOM | Un SimpleXMLElement | simplexml_import_dom() |
Un SimpleXMLElement | Un DOMElement | dom_import_simplexml() |
Si partes de una cadena o un archivo en lugar de un árbol DOM, normalmente no necesitas DOM en absoluto: usa directamente simplexml_load_string() o simplexml_load_file().
Problemas comunes
- Datos subyacentes compartidos. El
SimpleXMLElementdevuelto es una vista sobre los mismos datos que referencia el nodo DOM, no una copia independiente. Mantén el objeto DOM original en el ámbito: si se elimina por recolección de basura, el envoltorio SimpleXML puede quedar inutilizable. - Una entrada inválida devuelve
null. Un retornonull(o, en PHP 8+, unTypeErrorsi el argumento no es un objeto DOM) indica un error: comprueba siempre el resultado antes de encadenar llamadas a métodos. - La clase personalizada debe extender
SimpleXMLElement. Pasar un nombre de clase no relacionado para$class_nameprovoca un error; la clase debe ser una subclase.
Conclusión
simplexml_import_dom() te permite realizar trabajo preciso con la extensión DOM y luego leer o serializar el resultado con la sintaxis ligera de SimpleXML. Se complementa de forma natural con dom_import_simplexml() para el viaje de vuelta a DOM. Cuando tus datos ya residen en un árbol DOM, esta función es la forma más limpia de continuar con el acceso por propiedades de objeto en lugar de las verbosas llamadas a DOM.