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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.