Probleme d'utilisation de DOM

Probleme d'utilisation de DOM - PHP - Programmation

Marsh Posté le 29-08-2005 à 16:40:04    

Je cherche à regrouper les données de 2 documents xml en un seul.
 
il s'agit de documents office dont la structure est :
 
office:content
    |____ office:automatic-styles
    |____ office:body
 
vu que les 2 documents sont identiques en terme de structure, je me suis dit qu'il me suffisait de placer une variable sur le noeud pere de ce que je veux copier et de lancer une boucle foreach ($truc->childNodes as $node){ copier le noeud au meme endroit dans l'autre doc;}
 
voici le code que j'ai ecrit, ce qui semble poser probleme est la ligne avec les 3 etoiles devant:
 
     
    //creation de la variable correspondant au doc 1
    $content = new DomDocument();
    $content->load("intro_trans.xml" );
    $racine_content = $content->documentElement;
 
    //recherche de office:automatic-styles
    foreach ($racine_content->childNodes as $node){
      if ($node->tagName == "office:automatic-styles" ){
        $style = $content->documentElement;
        $style = $node;
      }
    }
 
    //recherche de office:body
    foreach ($racine_content->childNodes as $node){
      if ($node->tagName == "office:body" ){
        $corps = $content->documentElement;
        $corps = $node;
      }
    }
 
    //creation de la variable correspondant au doc 2
    $publis = new DomDocument();
    $publis->load("liste_publis.xml" );
    $racine_publis = $publis->documentElement;
 
    //recherche de office:automatic-styles
    foreach ($racine_publis->childNodes as $node){
      if ($node->tagName == "office:automatic-styles" ){
        $style_publis = $content->documentElement;
        $style_publis = $node;
      }
    }
 
    //copie des noeuds a la volee
***    foreach ($style_publis->childNodes as $node){
      $style->appendChild($node);
    }
 
    //recherche de office:body
    foreach ($racine_publis->childNodes as $node){
      if ($node->tagName == "office:body" ){
        $corps_publis = $content->documentElement;
        $corps_publis = $node;
      }
    }
 
    //copie des noeuds a la volee
    foreach ($corps_publis->childNodes as $node){
      $corps->appendChild($node);
    }
 
    $content->save('content.xml');
 
le message d'erreur est le suivant:
 
PHP Fatal error:  Uncaught exception 'DOMException' with message 'Wrong Document Error' in c:\\www\\creat-rapport.php:110\nStack trace:\n#0 c:\\www\\creat-rapport.php(110): DOMElement->appendChild(Object(DOMElement))\n#1 {main}\n  thrown in c:\\www\\creat-rapport.php on line 110
 
malheureusement, pour moi c'est inbitable. si quelqu'un a une idee, je lui en serai reconnaissant.

Reply

Marsh Posté le 29-08-2005 à 16:40:04   

Reply

Marsh Posté le 29-08-2005 à 16:47:17    

Mdr, PHP qui se met a balancer des erreur d'uncaught exception alors que sa gestion des exception est a un niveau plus que pitoyable ...  
 
En gros, regarde dans la doc de DOM ce qui peut generer une exception DOM et apres tu le fous dans un bloc :
 
try{
// mon truc qui peux envoyer une exception
}
catch(DOMException e)
{
// traitement de mon exception
}


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-08-2005 à 17:09:39    

ok, merci.
 
jusqu'a maintenant je n'accrochais que des noeuds vides, est ce que ca pourrait etre le fait que le noeud en question est une arborescence complete? (un noeud quoi!)
 
c'est bien la premiere fois que j'ai ce genre de probleme pour un appendChild, et pourtant je n'ai jamais eu a gerer d'exceptions.
 
oui, desole mais en fait en relisant mieux mon log j'ai vu que j'avais pointe la mauvaise ligne.

Reply

Marsh Posté le 29-08-2005 à 17:46:00    

Lis la doc


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-08-2005 à 09:50:58    

ok, d'apres la doc, je ne peux pas utiliser un noeud dans un docment autre que celui qui l'a cree.
 
est ce qu'a votre avis, je peux utiliser la fonction saveXML() de domDocument pour sauvegarder une chaine de caractere que je recopie dans l'autre document? (dans la doc ils expliquent pas si je peux faire ce que je veux avec)
 
sinon est ce que l'un de vous connait un moyen de transferer une partie d'un document vers un autre?

Reply

Marsh Posté le 30-08-2005 à 10:22:40    

Je l'ai fait ce matin meme ... mais en Java ... Mais si je me rappelle bien en PHP c'est a peu pres la meme chose :
 

Code :
  1. Element useCaseNew = getElement(); // Ici je prend l'element que je veux rajouter dans le 2ème doc
  2. Element finalrootElement = fileToWrite.getRootElement(); // Je prend le RootElement de fileToWrite  
  3. finalrootElement.addContent(useCaseNew);


 
En résumé c'est ça ... En php ça devrait ressembler assez à ça ... faut juste remplacer les point par des ->, enlever les typage des objets et rajouter les $ la ou il faut


Message édité par esox_ch le 30-08-2005 à 10:22:56

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-08-2005 à 10:41:52    

A priori, si on part du principe que j'importe des noeuds du document 1 au document 2, ca donne:
 
//creation du noue de reception
$cible_doc1 = $doc1->createElement();
 
$cible_doc1 = $doc1->importNode($noeud_a_deplacer);
$noeud_pere_de_la_cible->appendChild($cible_doc1);
 
au cas ou ca peut servir a qqn d'autre.
 
merci a tous

Reply

Marsh Posté le 30-08-2005 à 10:42:47    

Bein c'est a peu pres ce que je t'ai donner non?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-08-2005 à 10:45:50    

oué, c'est la traduction littérale.  :)
 
je prétend pas l'avoir trouvé tout seul.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed