DOM & XML : modifier un noeud existant avec xpath ?

Petit nouveau ! | 3 Messages

10 juin 2010, 20:09

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.

ViPHP
ViPHP | 5462 Messages

10 juin 2010, 20:29

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 ?

Petit nouveau ! | 3 Messages

12 juin 2010, 03:53

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.

Petit nouveau ! | 3 Messages

12 juin 2010, 04:45

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);

Petit nouveau ! | 1 Messages

05 sept. 2012, 14:58

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
Modifié en dernier par chezgn le 05 sept. 2012, 15:02, modifié 1 fois.

Mammouth du PHP | 1511 Messages

11 sept. 2012, 08:46

Tu as testé ton retour sur le item(0) ? Tu récupères quoi comme objet, ou donnée ?