Bonjour,
J'ai besoin d'ajouter des nœuds fils à un objet simpleXMLElement. Ces nœuds sont en fait déjà dans mon objet, je dois les dupliquer à d'autres endroits de l'objet.
Ainsi j'ai :
Code :
1 2 3 4 5 6 7
|
<parent>
<fils>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<parent/> |
J'aimerai pouvoir dupliquer l'un de ses fils (comme suit):
Code :
1 2 3 4 5 6 7 8 9 10 11
|
<parent>
<fils>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<fils>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<parent/> |
Voire faire ce genre de choses (l'un des nœud fils possède toute l'arborescence parente):
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<parent>
<fils>
<parent>
<fils>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<fils>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<parent/>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<fils>
<nom>foo</nom>
<prenom>bar</prenom>
<fils/>
<parent/> |
L'idée serait de récupérer l'un des nœuds, de le cloner puis de le reinjecter quelque part dans la structure de l'objet.
Code :
1 2 3 4 5 6
|
//$parent est l'objet simpleXMLElement global
$parent = simplexml_load_file($xml);
//$fils contient la référence vers le premier nœud fils. $new_fils est l'objet cloné
$new_fils = clone $fils;
//... |
D'après ce que j'ai lu, ce type de manipulation serait plus efficace avec DOM. SimpleXMLElement ne supportant pas la copie.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
$parent2 = dom_import_simplexml($parent);
//un var_dump($parent2) me retourne bien un objet DOMelement mais ce dernier est vide
//echo $parent2->saveXML(); ne retourne rien non plus pourtant $parent est valide
//concernant l'import seul
$parent2 = new DOMDocument;
$parent2->loadXML("".$parent->asXML()."");
//fonctionne
//je transforme le nœud fils
$node = dom_import_simplexml($fils);
$new_fils2 = $parent2->importNode($node, true);
$parent2->documentElement->appendChild($new_fils2); |
Je ne comprends pas pourquoi dom_import_simplexml() ne fonctionne pas. Y a t'il des gestions de namespace à prendre en compte?
DOMelement::importNode() aussi m'échappe un peu. Va t'il chercher dans la structure parente le nœud correspondant à $node pour me le retourner ? Si c'est le cas c'est une
étape inutile pour moi vu que je l'ai déjà dans $node ?
Je travaille avec simpleXMLelement que depuis hier et DOM depuis ce matin. Beaucoup de choses concernant la logique m'échappe encore.
Est-ce que mon objectif de copier des nœuds n'importe ou dans mon xml est impossible? Si quelqu'un a des pistes ou des éclaircissements je suis preneur.
Merci d'avance.