Page 1 sur 1

copier un noeud avec tous ses fils XML php5

Posté : 11 sept. 2008, 17:06
par _activmik
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>

Posté : 12 sept. 2008, 23:26
par sadeq
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>";
?>

Posté : 13 sept. 2008, 12:57
par _activmik
Merci beaucoup :D

Re: copier un noeud avec tous ses fils XML php5

Posté : 06 août 2009, 13:35
par elelie
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

Re: copier un noeud avec tous ses fils XML php5

Posté : 17 août 2009, 15:03
par ouckileou
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.