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

  1. #1
    Membre actif
    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
    Points : 240
    Points
    240
    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
    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
    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 actif
    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
    Points : 240
    Points
    240
    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
    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
    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 actif
    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
    Points : 240
    Points
    240
    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
    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
    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

  7. #7
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut Encore merci...
    du temps que vous consacrez à mon problème
    Ci-joint le fichier

  8. #8
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par julp Voir le message
    L'expression XPath ne doit pas retourner le noeud voulu Tout dépend de votre configuration qui requière allow_url_fopen à On et la prise en charge du protocole FTP(S) par PHP.
    D'après phpinfo, c'est ok.

    Par contre, je viens de m'apercevoir que c'est la version php 4 et non la 5 qui est installée

  9. #9
    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
    Citation Envoyé par scorpion1611
    Par contre, je viens de m'apercevoir que c'est la version php 4 et non la 5 qui est installée
    C'est sûr ? Parce que vous aviez évoqué SimpleXML plus tôt. Sinon il n'y a plus qu'à faire l'adaptation pour domxml

  10. #10
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par julp Voir le message
    C'est sûr ?

    Oui c'est sur. D'ailleurs, j'avais même trouvé l'astuce sur Developpez.com pour faire fonctionner simpleXML sur PHP4 en mettant la valeur 5 après l'extension .PHP soit .PHP5

  11. #11
    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
    Citation Envoyé par scorpion1611
    Oui c'est sur. D'ailleurs, j'avais même trouvé l'astuce sur Developpez.com pour faire fonctionner simpleXML sur PHP4 en mettant la valeur 5 après l'extension .PHP soit .PHP5
    Euh non, ce n'est pas spécialement pour utiliser SimpleXML qui n'est pas une extension PHP 4 mais pour utiliser PHP 5 (qui fournit SimpleXML et DOM normalement).

  12. #12
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par julp Voir le message
    Euh non, ce n'est pas spécialement pour utiliser SimpleXML qui n'est pas une extension PHP 4 mais pour utiliser PHP 5 (qui fournit SimpleXML et DOM normalement).
    Ben c'est ce que je dis mais mal ecrit

    J'ai utilisé l'astuce extension PHP5 pour utiliser simpleXMl sur un serveur ou PHP version 4 est installée

  13. #13
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par scorpion1611 Voir le message
    Ben c'est ce que je dis mais mal ecrit

    J'ai utilisé l'astuce extension PHP5 pour utiliser simpleXMl sur un serveur ou PHP version 4 est installée
    Non. Cette astuce permet de forcer l'utilisation de php5 sur un serveur ou php4 et php5 sont installés je pense. Parce que sinon la version de PHP prise par défaut (quand tu ne précises rien) serait php4

  14. #14
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par koopajah Voir le message
    Non. Cette astuce permet de forcer l'utilisation de php5 sur un serveur ou php4 et php5 sont installés je pense. Parce que sinon la version de PHP prise par défaut (quand tu ne précises rien) serait php4
    Ben alors j'ai rien compris alors

    Quand j'écris un petit bout de code utilisant simpleXML et que je l'enregistre sous le nom "tartanpion.php", il ne marche pas sur mon site.
    Si je l'enregistre sous le nom "tartanpion.php5", ca marche

    D'après phpinfo, mon hebergeur (OVH) utilise PHP 4.4.7

    cela signifie-t-il que PHP version 5 est aussi installée ?

    Je suis un peu perdu là!

  15. #15
    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
    Il faudrait se renseigner sur leur site et/ou consulter le forum qui leur est consacré (OVH) mais il me semble que l'on peut changer la version par défaut de PHP (sous-entendu associée à l'extension .php : SetEnv PHP_VER 5 dans un fichier .htaccess ?). Cela dépendra éventuellement de votre "offre".

    Quant au phpinfo, s'il porte une extension .php au lieu de .php5 il est tout à fait normal par rapport à la configuration actuelle qu'il vous indique une version 4.X.Y au lieu de 5 ... Je vous répète que l'extension SimpleXML requiert une version 5, il est notamment question d'exploiter les nouvelles possibilités objets de PHP (API PHP/Zend interne) que PHP 4 n'offre pas (implémentation des méthodes spéciales comme __get) :
    Citation Envoyé par http://fr.php.net/simplexml
    L'extension SimpleXML requiert PHP 5.

  16. #16
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par julp Voir le message
    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).

    J'ai pas trop compris ce que vous dire.

    Comment faut-il faire pour écrire directement dans le fichier ?

    En vous remerciant par avance

  17. #17
    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
    Citation Envoyé par julp Voir le message
    Vous la supprimez ou lui affectez une valeur fausse

  18. #18
    Membre actif
    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
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par julp Voir le message
    Vous la supprimez ou lui affectez une valeur fausse
    D'accord,

    Merci pour tout en tout cas

+ 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