2009-07-29 4 views
2

Je déplace du code de SimpleXML vers le DOM de PHP et je ne reçois pas encore les objets.Ajouter des enfants de manière récursive avec l'API DOM de PHP

SimpleXML, par exemple, je peux créer des éléments imbriqués très facilement comme ceci:

$Settings = new SimpleXMLElement("<root></root>"); 
$Settings->addChild('el1'); 
$Settings->el1->addChild('el2'); 
$Settings->el1->el2->addChild('el3'); 
$Settings->el1->el2->el3->addChild('el4', 'text'); 

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$Settings->asXML()))."</pre>"); 

// Result 
<?xml version="1.0"?> 
<root> 
<el1> 
<el2> 
<el3> 
<el4>text</el4> 
</el3> 
</el2> 
</el1> 
</root> 

dans DOM cependant, il semble que je dois soit garder une trace des poignées, ou chercher une liste et une boucle à travers elle afin d'obtenir un DOMElement pour un élément particulier. Il doit y avoir un moyen plus facile que je manque ...

Dites que j'ai le code ci-dessous, et que vous voulez ajouter el1, el2, el3, etc. comme ci-dessus. Quelle est la manière la moins bavarde de faire cela? De préférence sans avoir à avoir une variable en tant que handle pour chaque nœud auquel je veux ajouter un enfant, ou avoir à les récupérer via des boucles.

$DOMXML = new DOMDocument(); 
$DOMXML->appendChild($DOMXML->createElement('root')); 
$DOMXML->documentElement->appendChild($DOMXML->createElement('el1)); 
// ... 


echo($DOMXML->saveXML();); 
+0

Utilisez importNode et définissez le second param (deep) sur true, afin de copier récursivement l'arborescence. –

Répondre

0

Je ne pense pas qu'il y ait un moyen de faire ce que vous voulez en utilisant DOM :-(
J'ai essayé il y a un certain temps, quand je devais générer des fichiers XML avec DOM ...

La seule chose que je pouvais venir avec était quelque chose comme ce que vous êtes probablement à référenceurs, un long tas de code, comme celui-ci, je suppose:

$DOMXML = new DOMDocument(); 

$root = $DOMXML->createElement('root'); 
$DOMXML->appendChild($root); 

$elt1 = $DOMXML->createElement('el1'); 
$root->appendChild($elt1); 

$elt2 = $DOMXML->createElement('el2'); 
$elt1->appendChild($elt2); 

$elt3 = $DOMXML->createElement('el3'); 
$elt2->appendChild($elt3); 

$elt4 = $DOMXML->createElement('el4'); 
$elt4->appendChild($DOMXML->createTextNode('text')); 
$elt3->appendChild($elt4); 

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$DOMXML->saveXML()))."</pre>"); 

C'est en effet assez long :-(
OK , c'est puissant, y ous pouvez faire beaucoup de choses avec elle ... Mais, encore, une douleur à écrire ^^


Une solution alternative serait d'utiliser les pouvoirs combinés de SimpleXML et DOM:

D'abord, créer (simplement) votre document XML à l'aide SimpleXML, comme vous l'avez dit:

$simple2 = new SimpleXMLElement("<root></root>"); 
$simple2->addChild('el1'); 
$simple2->el1->addChild('el2'); 
$simple2->el1->el2->addChild('el3'); 
$simple2->el1->el2->el3->addChild('el4', 'text'); 

Et puis, le convertir en DOMDocument, en utilisant dom_import_simplexml:

// Convert to DOMDocument 
$dom2 = new DOMDocument(); 
$dom2->appendChild(
    $dom2->importNode(
     dom_import_simplexml($simple2), 
     true 
    ) 
); 

// Now, you can do your stuff that requires a DOMDocument object ;-) 
// Well, right now, displaying it will be enough, I suppose ? 

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$dom2->saveXML()))."</pre>"); 

Vous obtiendrez exactement la même ouput:

<?xml version="1.0"?> 
<root> 
<el1> 
<el2> 
<el3> 
<el4>text</el4> 
</el3> 
</el2> 
</el1> 
</root> 

Il pourrait ne pas être la solution la plus simple, ni le plus efficace ... Mais il semble fonctionner, et faire le travail ;-)

Si quelqu'un a une autre idée ... Je m'intéresse aussi, pour la prochaine fois je vais devoir faire face à DOMDocument!

+0

Merci! Peut-être que je peux garder toutes les poignées dans un tableau quelconque pour éviter d'avoir des dizaines de variables. J'aimerais pouvoir utiliser simplexml (j'étais à l'origine), mais je travaille avec un objet qui le déteste. Je ne sais pas pourquoi, mais ce tableau refuse de fonctionner avec tout ce qui a quelque chose à voir avec SimpleXML. http://www.amcharts.com/forum/viewtopic.php?pid=9418#p9418 – Eli

Questions connexes