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 de valeur dans un fichier XML


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 223
    Par défaut [DOM XML] Modification de valeur dans un fichier XML
    Bonjour à tous !

    Je recherche une solution pour pourvoir modifier une ou des valeurs dans un fichier XML via le PHP.

    Malgrès des recherches sur le site, je n'ai pas trouvé de solution. J'ai pu voir différentes choses mais sans vraiment comprendre comment faire.

    Voila mon souci :

    J'ai un fichier XML sur un serveur ftp qui ressemble à ceci :

    Code XML : 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
     
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <banlist>
        <ban>
            <datetime>donnee_A1</datetime>
            <nick>donnee_A2</nick>
            <method>donnee_A3</method>
            <period>donnee_A4</period>
            <address>donnee_A5</address>
            <cdkeyhash>donnee_A6</cdkeyhash>
            <profileid>donnee_A7</profileid>
            <by>donnee_A8</by>
            <reason>donnee_A9</reason>
        </ban>
        <ban>
            <datetime>donnee_B1</datetime>
            <nick>donnee_B2</nick>
            <method>donnee_B3</method>
            <period>donnee_B4</period>
            <address>donnee_B5</address>
            <cdkeyhash>donnee_B6</cdkeyhash>
            <profileid>donnee_B7</profileid>
            <by>donnee_B8</by>
            <reason>donnee_B9</reason>
        </ban>
    </banlist>
    Grâce à mes différentes recherches sur le site, j'ai réussi à lire le fichier XML et à afficher les données "nick" sous forme de lien et à les mettre dans un tableau

    Ce que j'aimerais pouvoir faire, c'est lorsque je clique sur un des lien, j'ouvre une nouvelle page afin de pouvoir changer toutes les valeurs des noeuds correspondant au nick selectionné via un formulaire.

    Par exemple, si sur ma page tableau, je clique sur "donnéeA2", je bascule sur une nouvelle page avec dans un formulaire les valeurs donneeA1, A3, A4 etc...

    Mais je ne sais comment faire :
    - pour afficher uniquement les valeurs d'après le "nick" selectionné
    - modifier et enregistrer les nouvelles valeurs

    L'un de vous peut-il m'aider ?

    En vous en remerciant d'avance

  2. #2
    Membre expérimenté

    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
    Par défaut
    Citation Envoyé par scorpion1611
    - pour afficher uniquement les valeurs d'après le "nick" selectionné
    Le plus simple serait l'extension SimpleXML (PHP 5) combiné à XPath ou à défaut utiliser une extension DOM.

    Citation Envoyé par scorpion1611
    - modifier et enregistrer les nouvelles valeurs
    C'est plutôt le travail des extensions dom (PHP 5) et domxml (PHP 4).

    A voir :

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 223
    Par défaut
    Merci Julp pour tes liens mais je les ai déjà parcouru mais sans grand succès.

    Pour lire et afficher les données "Nick", j'utilise SimpleXML


    Pour modifier des valeurs, j'ai bien trouvé ce post
    http://www.developpez.net/forums/showthread.php?t=74247

    mais chez lui, les noeuds parents sont uniques (<parent id="1">, <parent id="2"> etc). Chez moi, ils sont "anonymes"

    J'ai bien trouvé d'autres posts mais j'en arrive à tout mélanger (dom, simplexml, etc...) et je ne sais plus comment faire pour construire le code

  4. #4
    Membre expérimenté

    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
    Par défaut
    Voilà comment j'aurais écrit ça (avec DOM finalement) :
    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
    <?php
    define('DEBUG', TRUE);
    define('FICHIER_XML', 'mm_bans.xml');
     
    $dom = new DomDocument();
    $dom->preserveWhiteSpace = FALSE;
    $dom->formatOutput = TRUE;
    $dom->load(FICHIER_XML);
    $xpath = new DOMXPath($dom);
     
    if (defined('DEBUG') && DEBUG) {
        echo '<pre>';
        print_r($_POST);
        echo '</pre>';
    }
     
    /**
     * Première étape : lister les nick
     * Deuxième étape : proposer un formulaire pour modifier cette partie du ban
     * Troisième étape : modifier le fichier XML
     *
     * Bug (?) : les double quotes ne passent pas dans l'expression XPath
     **/
     
    if (!isset($_POST['nick'])) {
        $nicks = $xpath->query('/banlist/ban/nick');
        echo '<form method="POST">';
        echo '<select name="nick">';
        foreach ($nicks as $nick) {
           printf('<option>%s</option>', utf8_decode($nick->nodeValue));
        }
        echo '</select>';
        echo '<input type="submit" value="Valider"/>';
        echo '</form>';
    } else if (isset($_POST['nick']) && count($_POST) == 1) { // Mode fainéant
        $ban = $xpath->query(sprintf('/banlist/ban[nick = "%s"]', utf8_encode($_POST['nick'])));
        echo '<form method="POST">';
        foreach ($ban->item(0)->getElementsByTagName('*') as $elt) {
            if ($elt->nodeName != 'nick') {
                printf('%s : <input type="text" name="%s" value="%s" /><br />', utf8_decode($elt->nodeName), utf8_decode($elt->nodeName), utf8_decode($elt->nodeValue));
            } else {
                printf('<input type="hidden" name="%s" value="%s" /><br />', utf8_decode($elt->nodeName), utf8_decode($elt->nodeValue));
            }
        }
        echo '<input type="submit" value="Modifier" />';
        echo '</form>';
    } else if (isset($_POST['nick']) && count($_POST) > 1) {
        $ban = $xpath->query(sprintf('/banlist/ban[nick = "%s"]', utf8_encode($_POST['nick'])));
        foreach ($ban->item(0)->getElementsByTagName('*') as $elt) {
            if ($elt->nodeName != 'nick') {
                $elt->nodeValue = utf8_encode($_POST[$elt->nodeName]);
            }
        }
        if (defined('DEBUG') && DEBUG) {
            echo '<pre>' . htmlentities($dom->saveXML()) . '</pre>';
        } else {
            $dom->save(FICHIER_XML);
        }
    } else if (defined('DEBUG') && DEBUG) {
        die("Houston on a un problème :S");
    }
    Les cas particuliers méritent attention (caractères spéciaux et encodages)

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 223
    Par défaut
    Je te remercie de ta réponse Julp et surtout de ton code.

    Voici les messages d'erreur que j'obtiens

    En premier j'ai les infos suivantes qui apparaissent avec la liste déroulante + bouton "valider"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Array
    (
    )
    
    champ liste déroulante + bouton
    Ensuite, lorsque je sélectionne une valeur dans la liste déroulante j'obtiens soit ce résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Array
    (
        [nick] => Thoor
    )
     
     
    Fatal error: Call to a member function getElementsByTagName() on a non-object in (le chemin) on line 57
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Array
    (
        [nick] => Thoor
    
    + les différents champs qui s'affichent correctement
    
    )
    Ensuite lorsque je modifie une valeur et que je valide, j'obtiens une copie du fichier XML qui s'affiche sur ma page avec les modifications effectuées.

    sauf que lorsque je vais voir dans le fichier XML, aucune modif n'est prise en compte


    Pour info, le fichier se trouve sur un serveur ftp
    A la place de "scorpion.xml", j'ai mis :
    ftp://user:mot de passe@adresse IP/chemin/chemin/fichier.xml

    est-ce correct car dès fois, j'obtiens le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: DOMDocument::load() [function.DOMDocument-load]: I/O warning : failed to load external entity blablabla
    Une chose encore, les valeurs pour "nick" peuvent être n'importe quoi du style :
    - nono@roazon
    - !TOP! 00.Terror.00
    - [SWIZZ]=R.A.F.j=
    etc...



    Encore une fois merci pour ton aide si précieuse

  6. #6
    Membre expérimenté

    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
    Par défaut
    Citation Envoyé par scorpion1611
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function getElementsByTagName() on a non-object in (le chemin) on line 57
    L'expression XPath ne doit pas retourner le noeud voulu mais ça dépend du contexte (caractères spéciaux, autre erreur, ...).

    Citation Envoyé par scorpion1611
    Ensuite lorsque je modifie une valeur et que je valide, j'obtiens une copie du fichier XML qui s'affiche sur ma page avec les modifications effectuées.

    sauf que lorsque je vais voir dans le fichier XML, aucune modif n'est prise en compte
    C'est voulu : c'est l'effet du mode debug car souvent en testant on écrase son fichier avec un arbre vide (c'est une méthode parmi d'autres : sauvegarde sous un autre nom, copie de l'original avant, déplacement de l'original après la lecture, etc).

    Note : PHP sait, en temps normal, gérer les flux FTP. Tout dépend de votre configuration qui requière allow_url_fopen à On et la prise en charge du protocole FTP(S) par PHP. Vous pouvez obtenir toutes ces informations dans un phpinfo, la dernière se situant dans le premier tableau.

    Citation Envoyé par scorpion1611
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: DOMDocument::load() [function.DOMDocument-load]: I/O warning : failed to load external entity blablabla
    Vous n'auriez pas un caractère & qui traine tout seul devant ce blabla (au lieu de &amp; ou bien il faut le placer dans une section CDATA) ?

    Citation Envoyé par scorpion1611
    Une chose encore, les valeurs pour "nick" peuvent être n'importe quoi du style :
    - nono@roazon
    - !TOP! 00.Terror.00
    - [SWIZZ]=R.A.F.j=
    etc...
    Si vous pouviez me fournir une copie de ce fichier (éventuellement par MP) afin de disposer d'un réel jeu de test, ça en sera plus facile et d'autant plus réaliste que l'actuel

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

Discussions similaires

  1. Atteindre une valeur dans un fichier xml
    Par Syriel dans le forum C#
    Réponses: 7
    Dernier message: 31/03/2009, 10h57
  2. Réponses: 3
    Dernier message: 04/03/2009, 11h35
  3. modifier un valeur dans un fichier XML
    Par sekaijin dans le forum ANT
    Réponses: 4
    Dernier message: 17/02/2009, 14h50
  4. Réponses: 6
    Dernier message: 15/02/2008, 11h10
  5. Modifier une valeur dans un fichier xml
    Par arthrax dans le forum VBScript
    Réponses: 3
    Dernier message: 03/04/2007, 09h46

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