IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] PHP5 et XML comment ajouter un noeud dans un noeud précis?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 41
    Points
    41
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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');

  3. #3
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    Et pendant que j'y suis, ta requete xpath :

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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');

  5. #5
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    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.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  7. #7
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    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.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $parent->item(0)->removeAttribute($panier);
    merci en tout cas !

  9. #9
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    Non, un attribut, c'est par exemple ton "isbn".

    Il faut utiliser removeChild().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $parent->item(0)->removeChild($panier);

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    décidement, mon remove child a du mal a passer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Warning: DOMNode::removeChild() expects parameter 1 to be DOMNode, string given in on line 12

  11. #11
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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');
     
    ?>

  12. #12
    Candidat au Club
    Inscrit en
    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

  13. #13
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Resalut

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $panier = $parent->item(0)->getElementsByTagName('panier')->item(0);
    $parent->item(0)->removeChild($panier);
    Sais pas faire
    Personne pour m'aider ??

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/04/2011, 10h07
  2. [XSLT] Comment ajouter une image dans un HTML à partir d'un XML
    Par yellowsub122 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 12/04/2010, 14h59
  3. [XML] comment ajouter un lien hypertexte
    Par yakaoser dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 16/05/2008, 16h57
  4. Comment ajouter un élément dans un fichier XML
    Par sorilazer dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 04/06/2007, 21h56
  5. [DOM] Ajouter un noeud dans un noeud défini
    Par Hombre dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 15/05/2006, 19h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo