copier un noeud avec tous ses fils XML php5

Eléphant du PHP | 169 Messages

11 sept. 2008, 17:06

Salut,


J'ai un petit souci avec la fonction cloneNode(). J'aimerais qu'elle me copie un noeud avec tous ses fils, mais impossible, alors même que je lui donne l'attribut TRUE.

Mon code PHP :
  $dom = new DomDocument;
  $dom->load("test.xml");

  $listePays = $dom->getElementsByTagName('pays');
  foreach($listePays as $pays)
  
  $nouveauPays = $dom->createElement("pays");
  $paysIdentique = $pays->cloneNode(TRUE);
    
    
  $europe = $dom->getElementsByTagName("europe")->item(0);
  $europe->appendChild($nouveauPays);
  
    $dom->save('test.xml');
Et mon code XML :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <continents> <europe> <pays> <monnaie/> <dictateur/> </pays> </europe> <asie> </asie> </continents>

Quand je lance mon script, ça me donne :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <continents> <europe> <pays> <monnaie/> <dictateur/> </pays> <pays/></europe> <asie> </asie> </continents>
Alors que je voudrais :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <continents> <europe> <pays> <monnaie/> <dictateur/> </pays> <pays> <monnaie/> <dictateur/> </pays> </europe> <asie> </asie> </continents>

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 sept. 2008, 23:26

T'as 2 erreurs logiques :
La boucle foreach ne sert pas à grand chose sauf si tu veut faire une recherche du nœud à cloner mais il faut l'arrêter en cours de route sinon elle provoquera une boucle infinie puisque tu modifie l'objet lui-même sujet du foreach.
Pour résoudre d'abord ce problème, tu dois faire un accès direct au nœud à cloner et ainsi enlever le foreach.

D'un autre côté, tu utilises mal les variables objets servant pour le clone, il suffit d'une seule variable $nouveauPays et t'as pas besoin de créer un élément manuellement puisque tu fais un clonage (le nœud sera formaté automatiquement à partir du nœud cloné)

Voici, une correction commentée :
<?php
//Ouvrir XML
$dom = new DomDocument;
$dom->load("test.xml");
//Pointer sur l'noeud à cloner
$pays_existant_1 = $dom->getElementsByTagName('pays')->item(0);
//Cloner un nouveau noeud à partir du noeud pointé
$nouveauPays = $pays_existant_1->cloneNode(TRUE);
//Pointer sur le noeud d'insertion du nouveau clone
$europe = $dom->getElementsByTagName("europe")->item(0);
//Insérer le clone
$europe->appendChild($nouveauPays);
//Sauvegarder
$dom->save("test.xml");
//Afficher le résultat sous forme de chaine
echo "<pre>".htmlspecialchars( file_get_contents ("test.xml"))."</pre>";
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 169 Messages

13 sept. 2008, 12:57

Merci beaucoup :D

Petit nouveau ! | 1 Messages

06 août 2009, 13:35

Bonjour, j'ai un soucis avec DOM et je galère pas mal. Toute aide sera la bienvenue.
J'ai un XML De type :
<?xml version="1.0"?>
<CONTENTS>
<Content>
<Type>Folder</Type>
<Cle>/1</Cle>
<Name>1</Name>
<Url/>
</Content>
<Content>
<Type>Folder</Type>
<Cle>/2</Cle>
<Name>2</Name>
<Url/>
</Content>
<Content>
<Type>Folder</Type>
<Cle>/3</Cle>
<Name>3</Name>
<Url/>
</Content>
</CONTENTS>

et je desirerai obtenir le xml suivant :

<?xml version="1.0"?>
<CONTENTS>
<Content>
<Type>Folder</Type>
<Cle>/2</Cle>
<Name>2</Name>
<Url/>
</Content>
<Content>
<Type>Folder</Type>
<Cle>/1</Cle>
<Name>1</Name>
<Url/>
</Content>
<Content>
<Type>Folder</Type>
<Cle>/3</Cle>
<Name>3</Name>
<Url/>
</Content>
</CONTENTS>

C'est à dire échanger l'ordre de 2 noeuds Content ou copier les valeurs de l'un dans l'autre de tel sorte qu'en sortie cela soit inversé .....
Je n' y arrive pas.
Si quelqu'un pouvait me suggérait une idée ..... je le remercie d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 août 2009, 15:03

Pour toute nouvelle demande, merci d'ouvrir un nouveau sujet.

De plus, celui-ci est marqué Résolu, peu de monde ira le consulter tu as donc moins de chance d'obtenir de l'aide en procédant ainsi.