Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

boucle DomXML

1 réponse
Avatar
Nicolas Poulain
Bonjour à tous,

J'ai un problème avec le code suivant dont la boucle ne déplace pas tous
les noeuds comme je le souhaiterais puisqu'elle bloque après le
déplacement du premier noeud :

<?php
$doc = new DOMDocument();
$doc->loadXML("<book><chap1><parA/><parB/></chap1><chap2/></book>");
$bar = $doc->documentElement->firstChild;
$bump = $doc->documentElement->lastChild;
foreach ($bar->childNodes as $n) {
$bump->appendChild($n);
};
print $doc->saveXML();
?>

produit :
<?xml version="1.0"?>
<book><chap1><parB/></chap1><chap2><parA/></chap2></book>

et non :
<?xml version="1.0"?>
<book><chap1></chap1><chap2><par1/><par2/></chap2></book>


Merci d'avance.

--
Nicolas Poulain

1 réponse

Avatar
Mickael Wolff
Nicolas Poulain a écrit :
J'ai un problème avec le code suivant dont la boucle ne déplace pas tous
les noeuds comme je le souhaiterais puisqu'elle bloque après le
déplacement du premier noeud :



Tu fais une erreur de conception. Un document DOM est un arbre, pas
une liste chaînée. La conséquence en est que pour parcourir tout les
nœuds, il faut parcourir récursivement les nœuds enfants des nœuds
enfants (s'il y en a).


<?php
$doc = new DOMDocument();
$doc->loadXML("<book><chap1><parA/><parB/></chap1><chap2/></book>");
$bar = $doc->documentElement->firstChild;
$bump = $doc->documentElement->lastChild;
foreach ($bar->childNodes as $n) {
$bump->appendChild($n);



Tu ne demandes pas au enfants s'ils ont des enfants ?

};
print $doc->saveXML();
?>



Pour illustration :

<?php

function disp_node(DOMNode $node, $deep=0)
{
$out = sprintf("%sNode(%s)n"
, str_repeat("t", $deep)
, $node->nodeName) ;

if($node->hasChildNodes())
foreach($node->childNodes as $child)
$out .= disp_node($child, $deep+1) ;

return $out ;
}

$doc = new DOMDocument();
$doc->loadXML("<book><chap1><parA/><parB/></chap1><chap2/></book>");

echo disp_node($doc) ;

?>


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org