simplexml_import_dom()
SimpleXML est une extension PHP qui fournit une API simple pour travailler avec des documents XML. Découvrez simplexml_import_dom() et son utilisation.
Introduction
PHP vous offre deux façons distinctes de manipuler XML : l'extension DOM, puissante et conforme aux standards mais verbeuse, et SimpleXML, qui sacrifie une partie de cette puissance pour une API bien plus conviviale, basée sur les propriétés d'objet. simplexml_import_dom() est le pont entre les deux — elle prend un nœud d'un arbre DOM et vous retourne un SimpleXMLElement qui encapsule les mêmes données.
C'est utile lorsque vous avez effectué un travail intensif avec DOM (validation par rapport à un schéma, utilisation de XPath, manipulation d'espaces de noms) mais souhaitez lire le résultat avec la syntaxe concise de SimpleXML. Cette page explique comment fonctionne la fonction, quand l'utiliser, et les pièges à éviter.
Syntaxe
simplexml_import_dom(
object $node,
?string $class_name = SimpleXMLElement::class
): SimpleXMLElement|null$node— le nœud DOM à importer. En pratique, il s'agit d'une instance deDOMNode,DOMElementouDOMDocument. Si vous passez unDOMDocument, son élément document (la racine) est importé.$class_name— une classe optionnelle qui étendSimpleXMLElement. L'objet retourné est une instance de cette classe, ce qui vous permet d'y associer vos propres méthodes utilitaires.
La fonction retourne un SimpleXMLElement en cas de succès, ou null si le nœud ne peut pas être importé. Cette fonction est disponible depuis PHP 5.1.3.
Importer un document entier
Le cas le plus courant est d'analyser ou de construire un document avec DOM, puis de passer la racine à SimpleXML pour une lecture facilitée :
<?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
?>Passer l'objet $dom (un DOMDocument) importe son élément racine, de sorte que $book correspond à <book>. Comparez cela à l'équivalent DOM — $dom->getElementsByTagName('title')->item(0)->nodeValue — et l'attrait de SimpleXML devient évident.
Importer un seul élément construit manuellement
Vous pouvez également construire un nœud par programmation avec DOM et importer uniquement ce nœud :
Ici, nous créons un élément <title>, le rattachons au document, et passons l'élément racine du document ($dom->documentElement) à simplexml_import_dom(). asXML() sérialise ensuite le SimpleXMLElement en chaîne de caractères.
Relation avec le reste de l'API SimpleXML
simplexml_import_dom() est l'inverse de dom_import_simplexml(), qui convertit un SimpleXMLElement en DOMElement. Ensemble, elles vous permettent de circuler librement entre les deux extensions :
| Vous avez | Vous voulez | Utilisez |
|---|---|---|
| Un nœud DOM | Un SimpleXMLElement | simplexml_import_dom() |
Un SimpleXMLElement | Un DOMElement | dom_import_simplexml() |
Si vous partez d'une chaîne ou d'un fichier plutôt que d'un arbre DOM, vous n'avez généralement pas besoin de DOM du tout — utilisez directement simplexml_load_string() ou simplexml_load_file().
Pièges à éviter
- Données sous-jacentes partagées. Le
SimpleXMLElementretourné est une vue sur les mêmes données que celles référencées par le nœud DOM, et non une copie indépendante. Conservez l'objet DOM original dans la portée — s'il est collecté par le ramasse-miettes, le wrapper SimpleXML peut devenir inutilisable. - Une entrée invalide retourne
null. Un retournull(ou, dans PHP 8+, uneTypeErrorsi l'argument n'est pas du tout un objet DOM) signale un échec — vérifiez toujours avant d'enchaîner des appels de méthodes. - La classe personnalisée doit étendre
SimpleXMLElement. Passer un nom de classe non lié pour$class_nameest une erreur ; la classe doit être une sous-classe.
Conclusion
simplexml_import_dom() vous permet d'effectuer un travail précis avec l'extension DOM, puis de lire ou sérialiser le résultat avec la syntaxe légère de SimpleXML. Elle se marie naturellement avec dom_import_simplexml() pour le trajet retour vers DOM. Lorsque vos données se trouvent déjà dans un arbre DOM, cette fonction est le moyen le plus propre de continuer avec un accès par propriété d'objet plutôt que des appels DOM verbeux.