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] Modifier le contenu d'un noeud


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Scalp4
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 106
    Par défaut [SimpleXML] Modifier le contenu d'un noeud
    Bonjour, j'ai essayer de chercher un peu sur la faq, mais j'ai pas vraiment trouvé de réponses qui correspondent à ma requête...

    J'ai un fichier test.xml de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <document>
      <person>
        <name>Martin</name>
        <prenom>Jean</prenom>
      </person>
      <person>
        <name>Durand</name>
        <prenom>Mathieu</prenom>
      </person>
    </document>
    Actuellement je l'exploite grâce à "simplexml_load_file('test.xml');" et je parcours l'array.

    Maintenant j'aimerais tout simplement modifier mon document, pas la structure mais le contenu, dans un premier temps, changer donc les nom ou prénom que je peux avoir...

    J'ai pu trouver cette solution sur internet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function xml ($xml, $document)
    {
    	$fichier = fopen($document . '.temp', 'w');
    	fwrite($fichier, trim($xml));
    	fclose($fichier);
    	unlink($document);
    	rename($document . '.temp', $article);
    }
    Et donc je modifie l'array récupérer avec simplexml_load_file que je "sauvegarde" en utilisant la fonction : "xml($test->asXML(), 'test.xml');"

    Cette méthode fonctionne mais je la trouve un peu lourde, devoir à chaque fois que le fichier xml est modifier le supprimé/recréé...

    Y aurait-il une méthode plus adapté ?

    Merci 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
    La modification est assez triviale avec SimpleXML si on sait quel élément on doit modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sxml = simplexml_load_file('test.xml');
    // Modifier le name de la première person :
    $sxml->person[0]->name = 'Dupont';
    (il faut donc savoir comment est précisément situé l'élément à moins de l'atteindre par une expression XPath)

    Quant à écrire dans un fichier, la méthode asXML est capable d'écrire directement dans un fichier. Il suffit pour cela de lui en indiquer le nom/chemin en paramètre.

  3. #3
    Membre confirmé Avatar de Scalp4
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 106
    Par défaut
    Ah ?

    J'ai bêtement essayé de faire ça mais cela n'a pas fonctionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if (file_exists($file))
    {
    	$xml = simplexml_load_file($file);
        $items = $xml->item;
     
        foreach($items as $item)
        {
    	    if($item->id == $id)
    		{
    			$name = '<h4>' . $item->label . '</h4>';
    			$name .= $item->content;
    		}
        }
    }
    Je fais ça et aucun problème

    J'avais donc rajouter après le "foreach" :
    $xml->item[0]->content = 'Dupont';

    Mais ça n'a pas fonctionné, le xml n'a pas changé... Je viens de réessayer et ça ne fonctionne toujours pas, j'ai raté quelque chose ?

  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
    Incohérence :
    Citation Envoyé par Scalp4
    Mais ça n'a pas fonctionné, le xml n'a pas changé...
    Citation Envoyé par Scalp4
    Or il n'existe aucun élément nommé item (fils direct de la racine) dans ce que vous avez donné

  5. #5
    Membre confirmé Avatar de Scalp4
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 106
    Par défaut
    Non c'est pas le même xml que j'utilisais, dans mon premier post c'était pour donner un exemple, dans mon cas j'utilise ce fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="utf-8"?>
    <assistant>
        <item>
            <id>1</id>
            <label>Jean</label>
            <content>Jean est blond.</content>
        </item>
        <item>
            <id>2</id>
            <label>Marc</label>
            <content>Marc est brun.</content>
        </item>
    </assistant>
    Donc en utilisant mon foreach, j'arrive par exemple à bien retrouvé l'id de Marc et à bien afficher son content sans aucun problème, mais quand j'essaie de le modifier en ajoutant ça après le foreach :

    $xml->item[0]->content = 'Jean est roux.';

    Ca ne modifie pas mon fichier xml.

  6. #6
    Membre confirmé Avatar de Scalp4
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 106
    Par défaut
    Je viens de me rendre compte qu'on s'est peut-être mal compris.

    Ce que je veux faire c'est modifier le ".xml", et non modifier l'array que je récupère grâce au "simplexml_load_file()".

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

Discussions similaires

  1. Modifier le contenu d'un noeud XML avec XQuery
    Par Gm7468 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/07/2012, 08h44
  2. [DOM] Modifier le contenu d'un noeud complet
    Par getrude dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 04/07/2012, 11h48
  3. Comment modifier le contenu d'un noeud de type texte avec python?
    Par Tinkite82 dans le forum Général Python
    Réponses: 14
    Dernier message: 01/06/2010, 11h58
  4. [XML] Modifier le contenu d'un noeud
    Par joulive dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/10/2009, 14h12
  5. [SimpleXML] Modifier le contenu d'un noeud
    Par michael_MS dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 16/10/2008, 15h24

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