Création de sites web en éco-conception

08/04/2013 SimpleXML : transformer un enfant en racine

Soit un petit arbre en XML (disons un arbuste) dont on souhaite récupérer la branche "child" :

// l'arbre $parent_xml='<parent><child><div>rien</div><div>nada</div></child></parent>'; // l'objet $parent_sxe=simplexml_load_string($parent_xml); // l'objet enfant $child_sxe=$parent_sxe->child;

A-t-on récupéré un object équivalant à l'arbre

<child><div>rien</div><div>nada</div></child>

? On est en droit de le croire si l'on se contente de le visualiser par les moyens habituels : var_export($child_sxe), var_dump($child_sxe) ou encore var_dump($child_sxe->asXml()).

En réalité, l'objet en lui-même ne correspond pas à cet arbre. Pour s'en convaincre, il suffit d'effectuer une recherche avec XPATH :

echo $child_sxe->xpath("/*")[0]->getName(); // affichage du nom de la racine de l'objet => "parent" et non "child" :(

Deux enseignements à tirer. Déjà, les fonctions de débuggage ne fonctionnent pas correctement pour les objects simpleXml. Ensuite, pour qu'un enfant devienne une racine (c'est-à-dire le premier parent de l'arbre), on retiendra cette technique :

$child_sxe=simplexml_load_string($parent_sxe->child->asXML());

Vérification :

echo $child_sxe->xpath("/*")[0]->getName(); // affichage du nom de la racine de l'objet => "child" :)

Commentaires

Ajouter un commentaire :