Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2006, 20h38   #1
Futur Membre du Club
 
Inscription : juillet 2002
Messages : 51
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 51
Points : 15
Points : 15
Par défaut [DOM] PHP5 et XML comment ajouter un noeud dans un noeud précis?

Bonjour,
je souhaite modifier un noeud précis dans ma structure XML par l'intermédiaire d'un DOM en php.

Je debute avec les dom et le XML, et je n'arrive pas à modifier juste un noeud.
voici un bout de code xml:
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
<cat>
<livre isbn="1" lang="fr" sujet="dessert"> 
	<titre>Crêpes</titre> 
	<image src="m_crepes.jpg" />
	<auteur></auteur>
</livre>
<livre isbn="2" lang="fr" sujet="dessert"> 
	<titre>Crêpes</titre> 
	<image src="m_crepes.jpg" />
	<auteur></auteur>
</livre> 
<livre isbn="3" lang="fr" sujet="dessert"> 
	<titre>Crêpes</titre> 
	<image src="m_crepes.jpg" />
	<auteur></auteur>
</livre>
</cat>
Je voudrais donc ajouter un noeud s'appelant "panier" seulement au noeud ou isbn="2" (ou une autre valeur passé en parametre)

Vous pourriez m'aidé?
mon début de code php :
Code :
1
2
3
4
5
6
7
8
9
10
 
<?PHP
$document = new DomDocument();
$document->load('catalogue.xml');
 
... là, je sais pas comment faire ma requete xpath et comment travailler dessus après) ...
 
$panier = $modif->createElement('panier');
echo $panier->nodeName;
$document->save('catalogue3.xml');
Je vous remerci d'avance !
titou250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2006, 20h51   #2
Membre actif
 
Avatar de ghostdogpr
 
Étudiant
Inscription : octobre 2003
Messages : 198
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2003
Messages : 198
Points : 195
Points : 195
Envoyer un message via MSN à ghostdogpr Envoyer un message via Skype™ à ghostdogpr
Il faut utiliser les fonctions query() pour la requete xpath et appendChild() pour insérer l'élément. Ca doit donner qq chose comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$document = new DomDocument();
$document->load('catalogue.xml');
 
$xpath = new DomXPath($document);
 
$parent = $xpath->query("ta requete xpath ici");
 
$panier = $document->createElement('panier');
 
$parent->item(0)->appendChild($panier);
 
$document->save('catalogue3.xml');
ghostdogpr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2006, 20h58   #3
Membre actif
 
Avatar de ghostdogpr
 
Étudiant
Inscription : octobre 2003
Messages : 198
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2003
Messages : 198
Points : 195
Points : 195
Envoyer un message via MSN à ghostdogpr Envoyer un message via Skype™ à ghostdogpr
Et pendant que j'y suis, ta requete xpath :
ghostdogpr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 11h13   #4
Futur Membre du Club
 
Inscription : juillet 2002
Messages : 51
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 51
Points : 15
Points : 15
j'ai bien fait ça, mais voici le message d'erreur qu'il me mets :
Fatal error: Call to a member function appendChild() on a non-object in /info.php5 on line 15

Je comprends donc bien que $parent n'est pas un objet de type DomDocument, mais contient le résultat de mon objet Xpath.

Coment faire pour pouvoir insérer ma balise <panier> dans le noeud trouvé par ma fonction xpath?

Meric à vous !
Code :
1
2
3
4
5
6
7
$document = new DomDocument();
$document->load('catalogue.xml');
$xpath = new DomXPath($document);
$parent = $xpath->query("//livre[@isbn=2]");
$panier = $document->createElement('panier');
$parent->item(0)->appendChild($panier);
$document->save('catalogue3.xml');
titou250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 11h35   #5
Membre actif
 
Avatar de ghostdogpr
 
Étudiant
Inscription : octobre 2003
Messages : 198
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2003
Messages : 198
Points : 195
Points : 195
Envoyer un message via MSN à ghostdogpr Envoyer un message via Skype™ à ghostdogpr
Je viens de tester le même code.
Au début il m'a sorti une double-erreur : la tienne + un problème d'encodage ( UTF-8 ). J'ai enregistré le fichier catalogue.xml en UTF-8 sous notepad et maintenant ça marche.
ghostdogpr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 11h58   #6
Futur Membre du Club
 
Inscription : juillet 2002
Messages : 51
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 51
Points : 15
Points : 15
je dois vraiment avoir un souci avec le XMl, car j'ai maintenant une nouvelle erreur :
Parse error: parse error, unexpected T_OBJECT_OPERATOR on ligne 11

Voici mes 2 fichier (xml) et php
xml:
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version='1.0' encoding='UTF-8'?>
<cat>
<livre isbn="1" lang="fr" sujet="dessert">
   <titre>Crêpes</titre>
   <image src="m_crepes.jpg" />
   <auteur></auteur>
</livre>
<livre isbn="2" lang="fr" sujet="dessert">
   <titre>Crêpes</titre>
   <image src="m_crepes.jpg" />
   <auteur></auteur>
</livre>
<livre isbn="3" lang="fr" sujet="dessert">
   <titre>Crêpes</titre>
   <image src="m_crepes.jpg" />
   <auteur></auteur>
</livre>
</cat>

PHP:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?PHP
$document = new DomDocument();
$document->load('test2.xml');
 
$xpath = new DomXPath($document);
 
$parent = $xpath->query("//livre[@isbn=2]");
 
$panier = $document->createElement('panier');
 
$parent->item(0)->appendChild($panier); // LIGNE 11 
 
$document->save('catalogue3.xml');
?>
merci ghostdogpr pour ton aide !
titou250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 12h03   #7
Membre actif
 
Avatar de ghostdogpr
 
Étudiant
Inscription : octobre 2003
Messages : 198
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2003
Messages : 198
Points : 195
Points : 195
Envoyer un message via MSN à ghostdogpr Envoyer un message via Skype™ à ghostdogpr
J'ai copié-collé ton code et ça marche.

C'est toujours un problème d'encodage je pense. Ouvre ton XML sous notepad, enregistrer sous, puis choisis "Codage : UTF8" au lieu de ANSI.
ghostdogpr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 12h20   #8
Futur Membre du Club
 
Inscription : juillet 2002
Messages : 51
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 51
Points : 15
Points : 15
Ok ...... c'est samedi matin, je suis rentré à 23h du boulot hier, et je suis fatigue ......

j'avais oublié qu'avec mon hébergeur, pour que le fichier soit interpréter en php5, il fallait mettre l'extension php5.
So....
je suis un peu n** mais bon....;

merci en tout cas pour ton aide !

juste autre petite question, si je veux supprimer ce "panier" il suffit que je fasse un bout de code style
Code :
$parent->item(0)->removeAttribute($panier);
merci en tout cas !
titou250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 12h24   #9
Membre actif
 
Avatar de ghostdogpr
 
Étudiant
Inscription : octobre 2003
Messages : 198
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2003
Messages : 198
Points : 195
Points : 195
Envoyer un message via MSN à ghostdogpr Envoyer un message via Skype™ à ghostdogpr
Non, un attribut, c'est par exemple ton "isbn".

Il faut utiliser removeChild().

Code :
$parent->item(0)->removeChild($panier);
ghostdogpr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 13h53   #10
Futur Membre du Club
 
Inscription : juillet 2002
Messages : 51
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 51
Points : 15
Points : 15
décidement, mon remove child a du mal a passer.

Code :
1
2
3
4
5
6
7
$query = "//livre[@isbn=2]";
$xpath = new DomXPath($document);
// recherche l'identifiant
$parent = $xpath->query($query);
// supprime element panier au bon endroit
$parent->item(0)->removeChild('panier'); // LIGNE 12
$document->save('catalogue1.xml');
warning php :
Citation:
Warning: DOMNode::removeChild() expects parameter 1 to be DOMNode, string given in on line 12
titou250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 14h20   #11
Membre actif
 
Avatar de ghostdogpr
 
Étudiant
Inscription : octobre 2003
Messages : 198
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2003
Messages : 198
Points : 195
Points : 195
Envoyer un message via MSN à ghostdogpr Envoyer un message via Skype™ à ghostdogpr
C'est normal, removeChild() veut un noeud en argument.

Je te conseille de suivre les exemples que tu peux trouver sur http://php.net

Pour removeChild(), on aurait quelque chose comme :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<?php
 
$document = new DomDocument();
$document->load('test2.xml');
 
$query = "//livre[@isbn=2]";
$xpath = new DomXPath($document);
 
// recherche l'identifiant
$parent = $xpath->query($query);
 
// supprime element panier au bon endroit
$panier = $parent->item(0)->getElementsByTagName('panier')->item(0);
$parent->item(0)->removeChild($panier);
 
$document->save('catalogue1.xml');
 
?>
ghostdogpr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2006, 05h55   #12
Invité de passage
 
Inscription : avril 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 2
Points : 2
Points : 2
Par défaut DOM PHP 5 et XML Supprimer noeud complet

Bonjour à tous les deux,

Je reprend votre discussion un mois après en espérant que vous ou qqu'un d'autre pourra m'aider.

Mon problème : je cherche à supprimer un élément complet.
Pour utiliser l'exemple de titou250, je veux en plus de 'panier', supprimer le noeud parent complètement c-a-d <livre isbn="2" ...></livre> et tout son contenu bien sûr !!

Ya comme qque chose qui m'échappe dans le DOM

Fanx d'avance
FolleDiDine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2006, 21h02   #13
Invité de passage
 
Inscription : avril 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 2
Points : 2
Points : 2
Resalut

En fait mon pb est de remonter dans l'arborescence pour pointer sur le noeud parent de <painer/>

Code :
1
2
$panier = $parent->item(0)->getElementsByTagName('panier')->item(0);
$parent->item(0)->removeChild($panier);
Sais pas faire
Personne pour m'aider ??
FolleDiDine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h41.


 
 
 
 
Partenaires

Hébergement Web