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 XML] Modification d'un fichier XML en php


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [DOM XML] Modification d'un fichier XML en php
    bonjour,

    j'ai php 4.3.9 .
    j'utilise domxml et xsl pour créer et modifier un fichier xml.

    mon fichier xml :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm">
      <package>
        <name>smeserver-ab</name>
        <arch>i386</arch>
        <version epoch="0" ver="1.0" rel="1.0"/>
        <summary>tite ab</summary>
        <description>description ab</description>
        <problemes>probleme ab</problemes>
        <solutions>solution ab</solutions>
      </package>
      <package>
        <name>smeserver-al</name>
        <arch>noarch</arch>
        <version epoch="0" ver="1" rel="2"/>
        <summary>titre al</summary>
        <description>description al</description>
        <problemes/>
        <solutions/>
      </package>
      <package>
        <name>smeserver-gggggggg</name>
        <arch>noarch</arch>
        <version epoch="0" ver="1.0" rel="2.2"/>
        <summary>titre gggggggg</summary>
        <description>description gggggggg</description>
        <problemes/>
        <solutions/>
      </package>
    </metadata>
    j'essaie de modifier un package.
    Pour les attributs, cela se passe bien avec set_attribute
    Pour les elements, les noms ne sont pas remplaceés mais contaténés avec set_content

    mon code
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    <?php
     
    if(!$dom = domxml_open_file("primary_xml.xml")) {
      echo "Erreur lors de l'analyse du document\n";
      exit;
    }
     
    # recherche des elements
    $elements = $dom->get_elements_by_tagname("name");
    $arch = $dom->get_elements_by_tagname("arch");
    $version = $dom->get_elements_by_tagname("version");
    $summary = $dom->get_elements_by_tagname("summary");
    $description = $dom->get_elements_by_tagname("description");
    $problemes = $dom->get_elements_by_tagname("problemes");
    $solutions = $dom->get_elements_by_tagname("solutions");
     
    # recherche du package à modifier
    $a = 'smeserver-al';
    $trouve = "";
    for ($i = 0; $i<count($elements); $i++) {
        $node = $elements[$i];
        echo "L'élément[$i] est : " . $node->get_content()."\n";
        if( $node->get_content() == $a) {
            $trouve = $node->get_content();
            $nb_trouve = $i;
            echo "element n° : ".$nb_trouve." Nom : ".$trouve." ok\n";
            break;
        }
        else {
            echo "Pas trouvé element : ".$a."\n";
        }
    }
     
    if( $trouve == "" ) {
      echo "Elements : ".$a." non trouve\n";
    }
    else {
     
    # récupère elements à modifier
    $element = $elements[$nb_trouve];
    $arch = $arch[$nb_trouve];
    $version = $version[$nb_trouve];
    $summary = $summary[$nb_trouve];
    $description = $description[$nb_trouve];
    $problemes = $problemes[$nb_trouve];
    $solutions = $solutions[$nb_trouve];
     
    # modification des elemets
    echo "element : ".$element->get_content()." ok\n";
    $attr = $element->set_content("smeserver-alzzzz");
    echo "element : ".$element->get_content()." ok\n";
     
    echo "arch : ".$arch->get_content()." ok\n";
    $attr = $arch->set_content("i386");
    echo "arch : ".$arch->get_content()." ok\n";
     
    echo "version attr epoch : ".$version->get_attribute(epoch)." ok\n";
    $attr = $version->set_attribute("epoch", "0");
    echo "version attr epoch : ".$version->get_attribute(epoch)." ok\n";
     
    echo "version attr ver : ".$version->get_attribute(ver)." ok\n";
    $attr = $version->set_attribute("ver", "1.1");
    echo "version attr ver : ".$version->get_attribute(ver)." ok\n";
     
    echo "version attr rel : ".$version->get_attribute(rel)." ok\n";
    $attr = $version->set_attribute("rel", "2.1");
    echo "version attr rel : ".$version->get_attribute(rel)." ok\n";
     
    echo "sumarry : ".$summary->get_content()." ok\n";
    $attr = $summary->set_content("titre alzzzz");
    echo "sumarry : ".$summary->get_content()." ok\n";
     
    echo "description : ".$description->get_content()." ok\n";
    $attr = $description->set_content("description alzzzz");
    echo "description : ".$description->get_content()." ok\n";
     
    echo "problemes : ".$problemes->get_content()." ok\n";
    $attr = $problemes->set_content("probleme alzzzz");
    echo "problemes : ".$problemes->get_content()." ok\n";
     
    echo "solutions : ".$solutions->get_content()." ok\n";
    $attr = $solutions->set_content("");
    echo "solutions : ".$solutions->get_content()." ok\n";
     
    }
     
    # affichage des modifs à l'écran
    $xmlfile = $dom->dump_mem();
    echo htmlentities($xmlfile);
    ?>
    origine :
    <package>
    <name>smeserver-al</name>
    <arch>noarch</arch>
    <version epoch="0" ver="1" rel="2"/>
    <summary>titre al</summary>
    <description>description al</description>
    <problemes/>
    <solutions/>
    </package>

    apres modif :
    <package>
    <name>smeserver-alsmeserver-alzzzz</name>
    <arch>noarchi386</arch>
    <version epoch="0" ver="1.1" rel="2.1"/>
    <summary>titre altitre alzzzz</summary>
    <description>description aldescription alzzzz</description>
    <problemes>probleme alzzzz</problemes>
    <solutions></solutions>
    </package>

    Pour les attributs, ils sont bien remplacés avec les nouvelles valeurs, pour les elements c'est contaténés.

    Si quelqu'un voit le problème...

    Je crois que google n'est pas mon ami... cela fait des heures que je cherche!
    J'ai trouvé un probleme identique au mien : http://www.developpez.net/forums/arc.../t-178365.html
    Mais pas la solution!

    Merci
    Anne

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    j'ai trouvé une solution

    je n'utilise plus set_content

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo "element : ".$element->get_content()." ok\n";
    $textelement = $dom->create_text_node("smeserver-alzzzz");
    $children = $element->child_nodes();
    $attr =  $element->remove_child($children[0]);
    echo "element : ".$element->get_content()." ok\n";
    $attr =  $element->append_child($textelement);
    echo "element : ".$element->get_content()." ok\n";
    Je crée un text_node
    create_text_node : retourne une nouvelle instance de la classe DomText . Le contenu de ce noeud est content . Le noeud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec domnode_append_child .

    Je supprime le child de l'element (qui est le texte) => remove_child
    Je cree le child avec le nouveau texte => append_child

    et maintenant plus de concatenation de l'ancien texte avec le nouveau.

    J'ai fait des essais avec replace_child, mais je n'ai pas réussi.

    Si cela peux servir à quelqu'un...
    Anne

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/12/2008, 13h38
  2. Réponses: 1
    Dernier message: 22/04/2008, 11h24
  3. Réponses: 3
    Dernier message: 06/08/2007, 03h44
  4. [DOM] (org.w3c.dom) copier un noeud d'un fichier XML dans un autre fichier XML
    Par snoop dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/02/2007, 17h22
  5. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 11h49

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