Page 1 sur 1

DOM & XML : modifier un noeud existant avec xpath ?

Posté : 10 juin 2010, 20:09
par Electr0
Bonjour à tous et toutes,

Après 2 jours de recherches infructueuses, je me permets de solliciter votre aide pour modifier un fichier .xml avec DOM et php5.

Ce que je souhaite faire :



:arrow: modifier le contenu d'un noeud existant
:arrow: modifier la valeur d'un attribut donné

Voici un exemple de structure de fichier .xml utilisé :
<?xml version="1.0" encoding="utf-8"?>
<playlists user="62" username="admin" >
	<playlist user="62" id="1" active="1" name="ma playlist 1" style="99" styleTitle="Electro" created="1264895420" lastmod="1276189978" >
		<item id="65" ref="18" style="18" styleTitle=""  parent="17" order="1" >
			<image>deadmau5_some_chords.jpg    </image>
			<artist>Deadmau5    </artist>
			<remixers>remixers    </remixers>
			<title>Some Chords    </title>
			<remix_title>(Original mix)2    </remix_title>
			<editor>Editor    </editor>
			<timer>7:27    </timer>
			<link1>    </link1>
			<link2>    </link2>
			<link3>    </link3>
			<link4>    </link4>
		</item>
		<item id="27" ref="7" style="18" styleTitle=""  parent="0" order="2" >
			<image>Moderat_Rusty_Nails.jpg    </image>
			<artist>Moderat    </artist>
			<remixers>remixers    </remixers>
			<title>Rusty Nails    </title>
			<remix_title>(Original mix)1    </remix_title>
			<editor>Editor    </editor>
			<timer>5:50    </timer>
			<link1>    </link1>
			<link2>link2    </link2>
			<link3>link3    </link3>
			<link4>http://www.youtube.com/watch?v=DoxUiqUpkw4    </link4>
		</item>
		<item id="56" ref="17" style="17" styleTitle=""  parent="0" order="3" >
			<image>vitalic-flashmob.jpg    </image>
			<artist>Vitalic    </artist>
			<remixers>     </remixers>
			<title>Seconds Lives    </title>
			<remix_title>d    </remix_title>
			<editor>Citizen Records    </editor>
			<timer>    </timer>
			<link1>http://itunes.apple.com/be/album/second-lives/id329484983?i=329484995    </link1>
			<link2>ID beatPort    </link2>
			<link3>ID regie 3    </link3>
			<link4>ID regie 4    </link4>
		</item>
		<item id="68" ref="20" style="18" styleTitle=""  parent="17" order="4" >
			<image>mr_blink_gecko.jpg    </image>
			<artist>Mr Blink    </artist>
			<remixers>    </remixers>
			<title>Gecko    </title>
			<remix_title>    </remix_title>
			<editor>Fly Eye Records    </editor>
			<timer>    </timer>
			<link1>    </link1>
			<link2>    </link2>
			<link3>    </link3>
			<link4>    </link4>
		</item>
		<item id="52" ref="17" style="17" styleTitle=""  parent="0" order="5" >
			<image>vitalic-flashmob.jpg    </image>
			<artist>Vitalic    </artist>
			<remixers>     </remixers>
			<title>Poison Lips    </title>
			<remix_title>d    </remix_title>
			<editor>Citizen Records    </editor>
			<timer>s    </timer>
			<link1>http://itunes.apple.com/be/album/poison-lips/id329484983?i=329484987    </link1>
			<link2>ID beatPort    </link2>
			<link3>ID regie 3    </link3>
			<link4>ID regie 4    </link4>
		</item>
		<item id="25" ref="6" style="16" styleTitle=""  parent="15" order="6" >
			<image>kamui.jpg    </image>
			<artist>Kamui    </artist>
			<remixers>    </remixers>
			<title>Thrill Kill (Asys Remix)    </title>
			<remix_title>    </remix_title>
			<editor>Fe-Records    </editor>
			<timer>s    </timer>
			<link1>    </link1>
			<link2>    </link2>
			<link3>    </link3>
			<link4>    </link4>
		</item>
		<item id="13" ref="5" style="30" styleTitle=""  parent="17" order="7" >
			<image>depeche-mode-sounds-of-the-universe.jpg    </image>
			<artist>Depeche Mode    </artist>
			<remixers>    </remixers>
			<title>Wrong    </title>
			<remix_title>    </remix_title>
			<editor>Mute Records    </editor>
			<timer>    </timer>
			<link1>    </link1>
			<link2>    </link2>
			<link3>    </link3>
			<link4>http://www.youtube.com/watch?v=xJYD8VVilIE    </link4>
		</item>
		<item id="29" ref="8" style="26" styleTitle=""  parent="0" order="8" >
			<image>Noisecontrollers_yellow_minute.jpg    </image>
			<artist>Noisecontrollers    </artist>
			<remixers>    </remixers>
			<title>Yellow Minute (original mix)    </title>
			<remix_title>    </remix_title>
			<editor>Fusion records    </editor>
			<timer>    </timer>
			<link1>    </link1>
			<link2>    </link2>
			<link3>    </link3>
			<link4>    </link4>
		</item>
		<item id="66" ref="19" style="18" styleTitle=""  parent="17" order="9" >
			<image>diplo-tiesto_cmon.jpg    </image>
			<artist>Diplo, Tiesto    </artist>
			<remixers>    </remixers>
			<title>C'mon    </title>
			<remix_title>    </remix_title>
			<editor>Musical Freedom    </editor>
			<timer>msc_timer    </timer>
			<link1>    </link1>
			<link2>    </link2>
			<link3>    </link3>
			<link4>    </link4>
		</item>
		<item id="41" ref="13" style="21" styleTitle="HardTechno"  parent="20" order="10" >
			<image>palmtop_128x128.png </image>
			<artist>Artist </artist>
			<remixers> </remixers>
			<title>Title</title>
			<remix_title> </remix_title>
			<editor>snif </editor>
			<timer> </timer>
			<link1>ID iTunes </link1>
			<link2>ID beatPort </link2>
			<link3>ID regie 3 </link3>
			<link4>msc_idlink4 </link4>
		</item>
	</playlist>
	<playlist user="62" id="2" active="0" name="ma playlist 2" style="17" styleTitle="Electro" created="1264895420" lastmod="1274895420" >
		<item id="27" ref="7" style="18" styleTitle=""  parent="0" order="1" >
			<image>Moderat_Rusty_Nails.jpg    </image>
			<artist>Moderat    </artist>
			<remixers>remixers    </remixers>
			<title>Rusty Nails    </title>
			<remix_title>(Original mix)    </remix_title>
			<editor>Editor    </editor>
			<timer>5:50    </timer>
			<link1>    </link1>
			<link2>link2    </link2>
			<link3>link3    </link3>
			<link4>http://www.youtube.com/watch?v=DoxUiqUpkw4    </link4>
		</item>
	</playlist>
</playlists>
Exemples concrets de modifications souhaitéés :

1. Changer la valeur de "remixers" de l'item ayant l'id 27 et la ref 7 de la playlist ayant l'id="1"
2. Changer la valeur de l'attribut "style" de la playlist ayant l'id 2

Je ne souhaite pas qu'on me développe mon script mais si vous pouviez m'aiguiller je vous en serais reconnaissant.
Je reste à votre disposition si vous avez des questions ou si vous n'avez pas compris ma demande.

Je repasserai sur le forum après mon boulot vers 19h demain.

Merci déjà, bonne soirée.

Re: DOM & XML : modifier un noeud existant avec xpath ?

Posté : 10 juin 2010, 20:29
par stealth35
hello, il faut créer la requete xpath pour allé cherché les elements (2 requete dans ton cas) , ensuite tu fais les motif en changeant les atribut de DomElement :wink:
tu sais comment on ouvre un document avec DomDocument et comment creer une requete xpath ?

Re: DOM & XML : modifier un noeud existant avec xpath ?

Posté : 12 juin 2010, 03:53
par Electr0
Salut,

Merci pour ta réponse.

Je connais effectivement xpath que j'utilisais avec simplexml. D'après mes recherches je pense que pour l'utiliser avec DomDocument il faut utiliser domxpath ou quelque chose du style.

Mais je ne parviens pas à imaginer la structure globale de la requête pour la modification de mon fichier.

Je vais faire quelques essais et ensuite je poserai des questions plus précises.

Bonne nuit.

Re: DOM & XML : modifier un noeud existant avec xpath ?

Posté : 12 juin 2010, 04:45
par Electr0
Premier essai de modifications d'attributs avec xpath concluant. Je testerai la modification de la valeur d'un noeud après.

Voici ce que je fais, on sait jamais ça peut aider ^^
		$file = 'monfichier.xml';
		if( !file_exists($file) ) return false;
		
		$dom = new DomDocument();
		$dom->preserveWhiteSpace = false;
		$dom->load($file);
		
		$xpath = new DOMXPath($dom);
		$query = "//playlists/playlist[@id=".$playlistID."]";	
		$_playlist = $xpath->query($query);
		
		$_playlist->item(0)->setAttribute( 'style',  $style->id );
		$_playlist->item(0)->setAttribute( 'styleTitle',  $style->title );
		
		$dom->save($file);

Re: DOM & XML : modifier un noeud existant avec xpath ?

Posté : 05 sept. 2012, 14:58
par chezgn
Bonjour,

je n'arrive pas à modifier un attribut de mon fichier xml, pourtant je me suis largement inspiré du code ci dessus (merci Electr0)...
J'obtiens à tous les coups : Fatal error: Call to a member function setAttribute() on a non-object in.... sur la ligne (à partir de) : "$ligne->item(0)->setAttribute( 'p1', $p1 );"

voici le php :
$p1=2;
$p2=5;
$p3=1;
$nomUtilisateur=bob;
if( !file_exists("xml/liste-utilisateur2.xml") ) return false;
$dom2 = new DOMDocument();
$dom2->preserveWhiteSpace = false;
$dom2->load("xml/liste-utilisateur2.xml");
$xpath = new DOMXPath($dom2);
$ligne = $xpath->query("//main/utilisateur[@nom=".$nomUtilisateur."]");
$ligne->item(0)->setAttribute( 'p1',  $p1 );
$ligne->item(0)->setAttribute( 'p2',  $p2 );
$ligne->item(0)->setAttribute( 'p3',  $p3 );
$dom2->save("xml/liste-utilisateur2.xml");
et le xml :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> -<main> <utilisateur id="0" nom="anonyme" mdp="youpi" p1="3" p2="0" p3="0"/> <utilisateur id="1" nom="rene" mdp="hey" p1="3" p2="12" p3="1"/> <utilisateur id="2" nom="jean" mdp="pouet" p1="2" p2="6" p3="0"/> <utilisateur id="3" nom="raoul" mdp="hey" p1="1" p2="3" p3="0"/> <utilisateur id="4" nom="marcus" mdp="miller" p1="0" p2="0" p3="0"/> <utilisateur id="5" nom="a" mdp="a" p1="0" p2="0" p3="0"/> <utilisateur id="6" nom="bob" mdp="b" p1="1" p2="0" p3="0"/> <utilisateur id="7" nom="c" mdp="c" p1="0" p2="1" p3="0"/> <utilisateur id="8" nom="d" mdp="d" p1="2" p2="5" p3="0"/> <utilisateur id="9" nom="e" mdp="e" p1="0" p2="0" p3="1"/> </main>
Je ne suis pas le seul à avoir cette erreur mais je n'arrive pas à m'en dépêtrer (même après des heures sur les forums).
Merci d'avance pour vos lumières

GN

Re: DOM & XML : modifier un noeud existant avec xpath ?

Posté : 11 sept. 2012, 08:46
par momox
Tu as testé ton retour sur le item(0) ? Tu récupères quoi comme objet, ou donnée ?