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] Ajout d'un noeud fils


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut [DOM] Ajout d'un noeud fils
    Bonjour,

    A partir de 2 fichier, je voudrais les "concatener" en ajoutant le contenu de mon 2eme fichier dans le premier (a un endroit bien spécifique).

    Un exemple plus parlant...

    1er fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <article>
      ...
       <liens_objets_metiers>
          <lien_objet_metier type="" nature="" ref="/tests/fiches/ficheMediaExemple.xml">
             <position/>
          </lien_objet_metier>
       </liens_objets_metiers>
      ...
    </article>
    2ème fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <fiche_media>
      ...
    </fiche_media>
    ... et ce que je voudrais au final :
    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
    <?xml version="1.0" encoding="utf-8"?>
    <article>
      ...
       <liens_objets_metiers>
          <lien_objet_metier type="" nature="" ref="/tests/fiches/ficheMediaExemple.xml">
             <position/>
     
              <fiche_media>
                ...
              </fiche_media>
     
          </lien_objet_metier>
       </liens_objets_metiers>
      ...
    </article>

    ... et puis le morceau de code que j'ai écris, mais qui ne fonctionne pas
    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
    20
    21
    22
    23
    24
     
    $xml_article_filename = 'ArticleExemple.xml';
     
     
    $dom_article = new DomDocument();
    $dom_article->load($xml_article_filename);
     
    $article_lien_objet_metier_nodes = $dom_article->getElementsByTagName('lien_objet_metier');
    foreach($article_lien_objet_metier_nodes as $article_lien_objet_metier_node)
    {
      $xml_fiche_media_filename = $article_lien_objet_metier_node->attributes->getNamedItem('ref')->value;
      $xml_fiche_media_filename = substr(strrchr($xml_fiche_media_filename, '/'), 1);
     
      $dom_fiche = new DomDocument();
      $dom_fiche->load($xml_fiche_media_filename);
     
      $fiche_media_nodes = $dom_fiche->getElementsByTagName('fiche_media');
      foreach($fiche_media_nodes as $fiche_media_node)
      {
    $article_lien_objet_metier_node->appendChild($dom_fiche->documentElement); // $fiche_media_node);
      }
    }
     
    $dom_article->save('test.xml');
    ... l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error' in C:\wamp\www\test\concat_artiche_fiche.php:21 Stack trace: #0 C:\wamp\www\test\concat_artiche_fiche.php(21): DOMNode->appendChild(Object(DOMElement)) #1 {main} thrown in C:\wamp\www\test\concat_artiche_fiche.php on line 21

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Vous devez d'abord importer les noeuds du document d'origine via la méthode importNode avant de pouvoir les utiliser. Sans cela ils n'ont cours que par rapport au DomDocument d'origine et dans aucun autre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $article_lien_objet_metier_node->appendChild($dom_fiche->importNode($fiche_media_node));
    ... mais j'ai exactement la même erreur... !

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Elle est mal utilisée : vous faites référence au DomDocument dont est issu le noeud donc l'import ne risque pas de fonctionner C'est le DomDocument de destination qui doit importer le noeud original (du DomDocument d'origine).

    Si je ne me suis pas trompé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      foreach($fiche_media_nodes as $fiche_media_node)
      {
    $article_lien_objet_metier_node->appendChild($dom_fiche->documentElement); // $fiche_media_node);
      }
    Devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      $imported_dom_fiche_document_element = $dom_article->importNode($dom_fiche->documentElement);
      foreach($fiche_media_nodes as $fiche_media_node)
      {
        $article_lien_objet_metier_node->appendChild($imported_dom_fiche_document_element); // $fiche_media_node);
      }
    (j'ai repris le code d'origine : la partie appendChild me paraissant étrange)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    J'ai réussi !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $article_lien_objet_metier_node->appendChild($dom_article->importNode($fiche_media_node, true));
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2009, 23h09
  2. [DOM] Ajout d'un noeud (clone)
    Par DiamonDonald dans le forum APIs
    Réponses: 2
    Dernier message: 16/04/2008, 10h44
  3. [DOM] Problème d'ajout d'un noeud
    Par damanium dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 17/05/2006, 19h01
  4. [DOM] Ajout de noeuds
    Par zevince dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/03/2006, 13h39
  5. Pb d'Ajout un noeud fils dans une arborescence
    Par oramine dans le forum Oracle
    Réponses: 5
    Dernier message: 21/12/2004, 15h39

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