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] Insertion d'élément dans un fichier XML en PHP


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 6
    Points
    6
    Par défaut [DOM] Insertion d'élément dans un fichier XML en PHP
    Bonjour,

    J'ai un fichier XML de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <racine>
    <item>premier</item
    <item>avant</item>
    <item>apres</item>
    <item>dernier></item>
    </racine>
    et je voudrais insérer l'item
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <item>courant</item>
    entre les items avant et apres.

    J' ai cherché avec les fonctions appendChild, insertBefore après un positionnement avec DOMXpath->query(), mais systématiquement l'item est ajoute après l'item dernier.

    Une piste de recherche ??


  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 777
    Points
    17 777
    Par défaut
    Quel est votre code ? Par rapport à quoi vous basez-vous précisément pour réaliser l'insertion ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Bonjour Julp

    j'ai fini par trouver la bonne façon de faire, enfin je l'espère

    ci dessous le
    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
    29
    30
    31
    32
    33
     
    <?php
    // le xml avant l'insertion
    $xmlDoc='<?xml version="1.0" encoding="iso-8859-1"?>
    <racine>
      <liste>
        <item>premier</item>
        <item>avant</item>
        <item>apres</item>
        <item>dernier</item>
      </liste>
    </racine>';
     
    $doc= new DOMDocument();
    $doc->loadXML($xmlDoc);
    // on respecte la mise en forme initiale
    $doc->preserveWhitespace = false;
    $doc->formatOutput = true;
    // on crée l'élément à insérer
    $courant = $doc->createElement("item","courant");
     
    $xpathdoc= new DOMXPath($doc);
    // c'est dans ce noeud que l'on veut insérer
    $noeudliste = $xpathdoc->query('//liste')->item(0);
    // c'est avant ce noeud que l'on veut insérer
    $noeudapres = $xpathdoc->query('//liste/item[.="apres"]')->item(0);
    // c'est ici que l'insertion est éxécutée
    $noeudliste->insertBefore($courant,$noeudapres);
    // on sauve le xml obtenu
    $res = $doc->saveXML();
    // et on l'affiche
    var_dump($res);
    ?>
    J'ai ajouté un niveau (liste) pour être plus général.

    Je ne comprends pas pourquoi l'indentation n'est pas respectée lors de l'insertion

    de valider ce code ou de signaler un bug ou une amélioration.

  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 777
    Points
    17 777
    Par défaut
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $doc->preserveWhitespace = false;
    Doit être placé avant le chargement du document (méthodes load*) pour être pris en compte.

    Pourquoi faire une requête XPath pour récupérer l'élément liste ? D'autant plus que votre code devient spécialisé (ie si votre code comporte plusieurs liste les modifications ne seront possibles que sur la première ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // [...]
    $xpathdoc= new DOMXPath($doc);
    // c'est avant ce noeud que l'on veut insérer
    $noeudapres = $xpathdoc->query('//liste/item[.="apres"]')->item(0);
    // c'est ici que l'insertion est éxécutée
    $noeudapres->parentNode->insertBefore($courant,$noeudapres);
    // on sauve le xml obtenu
    $res = $doc->saveXML();
    // [...]
    (non testé)

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Julp , remarques pertinentes et testées

    Le code modifié devient donc
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <?php
    // le xml avant l'insertion
    $xmlDoc='<?xml version="1.0" encoding="iso-8859-1"?>
    <racine>
      <liste>
        <item>premier</item>
        <item>avant</item>
        <item>apres</item>
        <item>dernier</item>
      </liste>
    </racine>';
     
    $doc= new DOMDocument();
    // on respecte la mise en forme initiale
    $doc->preserveWhitespace = false;
    $doc->formatOutput = true;
    $doc->loadXML($xmlDoc);
     
    // on crée l'élément à insérer
    $courant = $doc->createElement("item","courant");
     
    $xpathdoc= new DOMXPath($doc);
     
    // c'est avant ce noeud que l'on veut insérer
    $noeudapres = $xpathdoc->query('//liste/item[.="apres"]')->item(0);
     
    // c'est ici que l'insertion est éxécutée
    $noeudapres->parentNode->insertBefore($courant,$noeudapres);
     
    // on sauve le xml obtenu
    $res = $doc->saveXML();
    // et on l'affiche
    var_dump($res);
     
    /*
    Résultat :
    string '<?xml version="1.0" encoding="iso-8859-1"?>
    <racine>
      <liste>
        <item>premier</item>
        <item>avant</item>
        <item>courant</item><item>apres</item>
        <item>dernier</item>
      </liste>
    </racine>
    ' (length=200)
     
    */
    ?>
    Merci à Julp et à ceux qui ont bien voulu prendre la peine de lire la demande.


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

Discussions similaires

  1. 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
  2. [DOM] Modifier un noeud dans un fichier XML
    Par erivoil dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/01/2007, 12h11
  3. Réponses: 3
    Dernier message: 29/06/2006, 16h54
  4. Insertion d'enregistrement dans un fichier XML
    Par davestar dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 02/04/2006, 17h22
  5. Réponses: 14
    Dernier message: 01/12/2003, 17h47

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