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 :

[SimpleXML] Copier un noeud pour le renommer, problème format DOM -> SimpleXML


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut [SimpleXML] Copier un noeud pour le renommer, problème format DOM -> SimpleXML
    Bonjour.

    J'essaie actuellement de mettre à jour un fichier XML en PHP.
    Pour cela, j'utilise SimpleXML et DOM.
    Mon but ici est de mettre à jour le nom d'un noeud.
    Il me faut donc créer un noeud avec le nouveau nom, lui associer les noeuds fils du noeud avec le précédent nom, et supprimer le noeud avec le précédent nom.

    Exemple:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <DATA>
       <name_1>
          <fils_1>
             <petit_fils_1>blabla</petit_fils_1>
             <petit_fils_2>blabla</petit_fils_2>
             <petit_fils_3>blabla</petit_fils_3>
          </fils_1>
       </name_1>
    </DATA>

    Je veux remplacer 'name_1' par 'camion_1':

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <DATA>
       <camion_1>
          <fils_1>
             <petit_fils_1>blabla</petit_fils_1>
             <petit_fils_2>blabla</petit_fils_2>
             <petit_fils_3>blabla</petit_fils_3>
          </fils_1>
       </camion_1>
    </DATA>

    J'ai donc mon côté PHP comme ceci:

    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
    // loading the content of the corresponding XML file
    $xml = new SimpleXMLElement($tmpXML,null,true);					
     
    // getting the entry of interest
    $foundNode = $xml->xpath("/DATA/name_1");	
    $newNode = $xml->addChild('camion');
     
    foreach ($foundNode[0]->children() as $eachReq)
    {
         // copying each child from the previous entry to the new one
         prevToNewNode($xml,$eachReq,$foundNode[0]);
    }
     
    header("Content-type: text/xml");
    $xml->saveXML($tmpXML);
    Et voilà la fonction PHP prevToNewNode que j'ai trouvé sur le net :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function prevToNewNode(SimpleXMLElement $to, SimpleXMLElement $from, SimpleXMLElement $parentNode)
    {	
       $toDom = dom_import_simplexml($to);
       $fromDom = dom_import_simplexml($from);
       $parentDom = dom_import_simplexml($parentNode);
       $toDom->removeChild($toDom->ownerDocument->importNode($parentDom, true));	$toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
    }
    Mes problèmes sont les suivants:

    • Le précédent noeud est bel et bien supprimé
    • Le noeud créé s'ajoute bel et bien à mon fichier XML
    • MAIS le noeud créé ne comporte qu'un seul tag ! Exemple:


    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <DATA>
       <camion_1/>
          <fils_1>
             <petit_fils_1>blabla</petit_fils_1>
             <petit_fils_2>blabla</petit_fils_2>
             <petit_fils_3>blabla</petit_fils_3>
          </fils_1>
    </DATA>

    Je n'ai donc pas de tag qui clôt mon nouveau noeud, et un "tag d'ouverture" créé comme s'il n'avait pas de contenu.

    Est-ce un problème de conversion DOM <=> SimpleXML ?
    Comment résoudre mon problème ?

    Merci beaucoup !

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Le code trahit un état de compréhension assez confus. Les arguments de la fonction prevToNewNode sont mal nommés. Essayez de faire une phrase ordinaire sur la fonctionalité de la fonction pour justifier l'emploi de mots "to", "from" etc...? je ai mal à former une.

    La façon la plus parlante est de vous montrer une version qui marche avec des constructions assez proches de ce que vous avez montrées. Découvrez les éléments essentiels et leur usages vous-mêmes.

    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
    25
    26
    27
    28
    $xml = new SimpleXMLElement($tmpXML,null,true);
    $foundNode = $xml->xpath("/DATA/name_1");	
    $newName="camion";
     
    if (count($foundNode)!=0) {
        foreach($foundNode as $targetNode) {
            rename_node($targetNode, $newName);
        }
    }
     
    //etc... saveXML() etc...
     
    function rename_node(SimpleXMLElement $targetNode, $newName) {
     
        $targetNodeDom=dom_import_simplexml($targetNode);
        $newNode=$targetNodeDom->ownerDocument->createElement($newName);
     
        foreach($targetNodeDom->childNodes as $node) {
            $newNode->appendChild($node->cloneNode(true));
        }
     
        foreach($targetNodeDom->attributes as $attr) {
            $newNode->appendChild($attr->cloneNode(true));
        }
     
        $targetNodeDom->parentNode->replaceChild($newNode, $targetNodeDom);
     
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    Oui je n'ai pas dit que je suis un pro du PHP. J'ai acquis des bases, et ensuite c'était de l'auto-formation ...
    D'où le fait que j'apprenne en ce moment à gérer des fichiers XML via PHP

    J'ai réussi à contourner le problème en passant par DOM.

    La fonction que j'ai citée dans mon précédent post est une fonction trouvée sur le net sur un forum. Elle n'était pas de moi.
    Si j'ai bien compris son fonctionnement, les paramètres passés en arguments sont des objets SimpleXML, et ils sont convertis en DOM lors des premières étapes, pour ensuite utiliser les fonctions DOM pour cloner le noeud d'intérêt etc.

    Cependant j'ai contourné le problème en passant directement par DOM sans utiliser SimpleXML et tout fonctionne correctement
    Je peux mettre mes codes si jamais vous souhaitez apporter des corrections à mes lignes de profane lol ...

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Si j'ai bien compris son fonctionnement, les paramètres passés en arguments sont des objets SimpleXML, et ils sont convertis en DOM lors des premières étapes, pour ensuite utiliser les fonctions DOM pour cloner le noeud d'intérêt etc.

    Cependant j'ai contourné le problème en passant directement par DOM sans utiliser SimpleXML et tout fonctionne correctement
    Ce n'était pas d'aller-retour entre SimpleXML et DOM qui était le problème. C'étaient des incorrectes utilisations des outils DOM. Donc, il ne peut y avoir de magique comme ça: oh, je décide de travailler directement en DOM et tout est soudainement se ranger en place. Ce n'est pas l'attitude qu'on avance. Ne vous pensez une seconde que ça me fait plaisir de corriger le code... le rest c'est comme vous voulez.

Discussions similaires

  1. [XSLT] Copier un noeud avec ces éléments sauf un
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/10/2006, 14h55
  2. [XSLT]copier un noeud en changeant son nom
    Par damyrid dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/03/2006, 12h54
  3. [DOM] Problème avec DOM pour le XML...
    Par Julien_riquelme dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 02/03/2006, 15h51
  4. Comment utiliser Developpez.com pour résoudre votre problème
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 0
    Dernier message: 08/01/2005, 12h11
  5. Réponses: 3
    Dernier message: 27/07/2004, 13h01

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