W3docs

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 de DOMNode, DOMElement o DOMDocument. Si pasas un DOMDocument, se importa su elemento documento (la raíz).
  • $class_name — una clase opcional que extiende SimpleXMLElement. 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:

php— editable, runs on the server

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:

TienesQuieresUsa
Un nodo DOMUn SimpleXMLElementsimplexml_import_dom()
Un SimpleXMLElementUn DOMElementdom_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 SimpleXMLElement devuelto 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 retorno null (o, en PHP 8+, un TypeError si 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_name provoca 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.

Práctica

Práctica
¿Cuáles de las siguientes afirmaciones sobre SimpleXML en PHP son verdaderas?
¿Cuáles de las siguientes afirmaciones sobre SimpleXML en PHP son verdaderas?
Was this page helpful?