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

Langage PHP Discussion :

simplexml extraire une info d'un xml via php


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2021
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Rédacteur technique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 276
    Par défaut simplexml extraire une info d'un xml via php
    Bonjour,

    je suis débutant de débutant en PHP (ceci explique probablement cela).
    J'ai lu tout un tas de discussions sur l'extraction de données d'un simplexml par l'outil PHP, mais à chaque fois les codes employés sont énormes (car les fichiers xml sont également énormes et ce que souhaitent faire les gens est complexe).

    J'ai lu aussi des tutos sur l'utilisation de simplexml, mais j'ai vu uniquement des tutos qui expliquent comment extraire les données en fonctions de la position de la donnée dans le xml (par exemple ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $lieu  =  simplexml_load_file ( 'personnes_test.xml' );
    echo  $lieu -> personne[ 1 ] -> lieu ;
    ?>
    qui ne me permet que d'extraire les données de la deuxième « personne » de mon fichier xml)

    Pour ma part, je cherche un truc tout simple, et peut-être que l'info est facile à trouver, mais je ne sais pas quels mots-clés chercher pour la trouver. Je suis peut-être passé devant sans la voir ().

    Bref, voici un exemple de mon fichier xml (il est vraiment simple pour le moment puisque j'apprends pas à pas).

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <donnees>
     
    	<personne id="Toto">
    		<lieu>Salle 205</lieu>
    	</personne>
     
    	<personne id="Titi">
    		<lieu>Salle 204</lieu>
    	</personne>
     
    	<personne id="Tutu">
    		<lieu>Lilliad</lieu>
    	</personne>
     
    </donnees>

    Donc on a Toto dont le lieu est Salle 205, Titi en Salle 204, etc. C'est basique.

    Et je voudrais pouvoir dire à mon PHP d'aller chercher, par exemple, la valeur « lieu » de la personne dont le id est « Titi ».
    Donc, ici, mon code echo $lieu -> personne[ 1 ] -> lieu ; fonctionne, bien sûr, puisque Titi est la 2eme personne du xml et que 1 ça correspond à la 2eme entrée (car ça commence par 0 (oui, oui, j'ai l'air d'enfiler des évidences, là, mais pour mon cerveau de débutant, c'est une révision indispensable)).
    Bon, Mais si Titi se retrouve tout à coup à la 4eme place du xml, ben ça ne marche plus.

    J'ai vu ici une discussion dans laquelle le début du code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $xml = new SimpleXMLElement('test.xml',0, TRUE);
        $t = '';
        foreach ($xml->agency as $key){
            if($key['code'] == '2AV02'){
    et j'ai l'impression que c'est un peu ce que je cherche à faire, mais le code qui est proposé ensuite est tellement compliqué que je m'y perds.

    Est-ce qu'au moins cette piste-là est la bonne ?

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Tu peux faire de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $xml = simplexml_load_string($xml);
     
    foreach ($xml->personne as $personne) {
        if ($personne['id'] == 'Titi') {
            echo "{$personne['id']} => {$personne->lieu}\r\n";
        }
    }
    1. On vérifie l'ID de chaque personne
    2. Si on est sur Titi on affiche le lieu

    Quand tu auras un peu de bouteille tu pourras faire une requête XPath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result = $xml->xpath('//personne[@id="Titi"]/lieu');
    echo "Titi => {$result[0]}\r\n";

  3. #3
    Membre averti
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2021
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Rédacteur technique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 276
    Par défaut
    Ouiii, ça marche.
    Merci Séb.

    pour l'instant, mon code en est à cet aspect là
    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
     
    <?php
        // le code simplexml_load_file convertit un fichier XML en objet
        $nomlieu = simplexml_load_file ( 'donnees.xml' ); 
     
          // Pour chaque <personne>, nous affichons un nom (en dur, défini par id) et un <lieu>, puis on précise date et heure.
     
          // code pour Toto
          foreach ($nomlieu->personne as $personne)
            {
            if ($personne['id'] == 'toto') 
              {
              echo '• Toto est '.$personne -> lieu.'<br />';
              echo '(Mise à jour de la connection le '.$personne -> horodate.')<br /><br />';
              }
            }
        ?>
    (oui, j'ai ajouté l'horodate dans mon xml)

    Il me reste qqes perfectionnements à faire, notamment peut-être réussir à viser plutôt un des "enfant" (child) comme condition (ici, le id == toto qui est visé est un attribut de personne, mais je peux tenter aussi de le sélectionner par le lieu qui est un enfant).

    Et ensuite je dois aussi perfectionner l'injection de données dans mon xml (la partie AVANT ce PHP de lecture) en cherchant comment ne pas cumuler les infos mais remplacée celles qui doivent l'être. Mais c'est une autre histoire, je viendrai peut-être la raconter ici plus tard, là il est temps de manger, le cours de PHP est dans pas longtemps. Au moins j'aurais éclairci qqes points avec votre aide, mes questions seront plus cadrées.

    Merciiii encore.

  4. #4
    Membre averti
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2021
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Rédacteur technique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 276
    Par défaut
    Je viens compléter un peu, comme promis.
    Mon code est arrivé maintenant à l'aspect suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
        // le code simplexml_load_file convertit un fichier XML en objet
        $donnees = simplexml_load_file ( 'donnees.xml' ); 
     
          // Pour chaque <personne>, nous affichons un <nom> et un <lieu>, puis on précise date et heure.
          foreach ($donnees -> personne as $personne) 
            {
             echo '• '.$personne -> nom.' est '.$personne -> lieu.'<br />';
             echo '(Mise à jour de la connection le '.$personne -> horodate.')<br /><br />';
            }
        ?>
    Alors, vous allez me dire (et vous aurez raison) : « mais dans ton code, il n'y a plus de lecture ciblée, ce qui était le sujet de la discussion ! »

    Oui, car j'ai amélioré le code en faisant une écriture ciblée en amont. càd que mon php qui écrit le xml ne change QUE les infos de la personne choisie.
    Et voici donc le code en question.

    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
     
          date_default_timezone_set('Europe/Paris');   
          // définit le fuseau horaire 
          $horodate = date('d M Y, G : i', time());
          // récupère l'horodate actuelle et la met en variable
     
          $identite=$_POST["identite"];
          // récupère la variable identite (ici un chiffre) du formulaire précédent dans une variable $identite
     
          $lieu=$_POST["lieu"];
          // récupère la variable lieu du formulaire précédent dans une variable $lieu
     
          $xml_a_modifier = simplexml_load_file('donnees.xml');
          // récupère le contenu du fichier xml
          // et le met dans une variable $xml_a_modifier
     
          // code pour remplir
          foreach ($xml_a_modifier->personne as $personne)
            {
            if ($personne['id'] == $identite)
            // vérifie la concordance entre la valeur de variable $identite
            // qui est un chiffre donné par le formulaire
            // et la compare avec la valeur de id de la personne
     
     
    	        //si c'est la même
            	{
    	        $personne->lieu=$lieu;
    	        // va coller la valeur de la variable $lieu
    	        // qui est le lieu reçu par le formulaire
    	        // dans la balise lieu de cette personne
    	        $personne->horodate=$horodate;
    	        // idem pour date et heure
    	        }
            }
     
          $xml_a_modifier->asXML('donnees.xml');
          // écrit le nouveau contenu de la variable $xml_a_modifier au fichier xml
     
          echo "J'ai repéré la valeur <strong>".$identite."</strong>, qui est un chiffre,<br />";
          echo "(1 pour Toto, 2 pour Titi, 3 pour Tutu)<br />";
          echo "présente comme <em>ID</em> de personne dans le xml.<br /><br />";
          echo "Ceci me permet de retrouver les valeurs de cette personne.</br>";
          echo "J'ai modifié la valeur <em>lieu</em> du xml par <strong>".$lieu."</strong> pour cette personne.<br />";
          echo "J'ai modifié la valeur <em>horodate</em> du xml par <strong>".$horodate."</strong> pour cette personne.<br />";
          // juste pour afficher ce que j'ai fait
     
     
        ?>

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

Discussions similaires

  1. [SimpleXML] Resuperation d'info avec simple xml
    Par fabrice88 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/08/2011, 19h09
  2. Extraire une info d'un fichier
    Par Bruno51 dans le forum Langage
    Réponses: 8
    Dernier message: 05/09/2007, 10h49
  3. [SimpleXML] Lire un XML via PHP
    Par major2 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 20/04/2007, 14h08
  4. Réponses: 2
    Dernier message: 19/08/2006, 12h47
  5. [SAX] [Débutant(e)]Sortir une info d'un XML en SAX
    Par BernardT dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 07/07/2005, 21h15

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