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 :

Lire un noeud XML Specifique (en fonction de sa valeur)


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 48
    Points : 26
    Points
    26
    Par défaut Lire un noeud XML Specifique (en fonction de sa valeur)
    Bonjour à tous,

    Je ne suis pas développeur web (ou plutôt, plus ... depuis longtemps)

    Mais j'essai de récuperer les valeur d'un fichier XML qui ressemble a ceci :

    <?xml version="1.0" ?>
    - <root>
    - <releve>
    <idbalise>10</idbalise>
    <date>2011-08-03 17:38:36</date>
    <vitesseVentMoy>9</vitesseVentMoy>
    <vitesseVentMax>18</vitesseVentMax>
    <vitesseVentMin>0</vitesseVentMin>
    <directVentMoy>0</directVentMoy>
    <directVentInst>0</directVentInst>
    <temperature>10</temperature>
    <hydrometrie />
    <pression />
    <luminosite />
    </releve>
    - <releve>
    <idbalise>11</idbalise>
    <date>2011-08-03 17:28:08</date>
    <vitesseVentMoy>9</vitesseVentMoy>
    <vitesseVentMax>22</vitesseVentMax>
    <vitesseVentMin>0</vitesseVentMin>
    <directVentMoy>67</directVentMoy>
    <directVentInst>45</directVentInst>
    <temperature>20</temperature>
    <hydrometrie />
    <pression />
    <luminosite />
    </releve>

    .... etc
    Je voudrais récupérer toutes les valeurs du noeud "releve" ou "idbalise" est egal a "11". Et la, pas moyen, ce qui est très simple avec une db, m'a l'air insurmontable avec du XML ... oO ... je dois mal m'y prendre, c'est louche.

    Voici un bête code php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?
    $releve_balise = simplexml_load_file('http://blalabla/relevemeteo.xml'); 
    $xpath = '/releve/root/[idbalise = 10]' ;
    $resultat = $releve_balise->xpath($xpath) ;
     
    echo $resultat ;
    ?>
    Qui bien évidemment ne marche pas, et je me doute qu'il manque plein de chose, mais si quelqu'un pouvait m’éclairer un petit peu sur la création de ce qui va me permettre de sélectionner le bon Noeud, puis d'en afficher toutes les valeurs "enfants", je me débrouillerais ensuite pour faire ce que je veux.

    Tout ce que je trouve sur le sujet m'a l'air hyper compliqué, j'imagine qu'il y a bcp plus simple.

    Merci Bcp

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 48
    Points : 26
    Points
    26
    Par défaut
    J'avais également essayé ce morceau de 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
    <?php
        $fichier = "http://blablabla/relevemeteo.xml";
     
        // Ma propre fonction de traitement des balises ouvrantes
        function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
        {
            // En fait... nous nous conteterons de mémoriser le nom de la balise
            // afin d'en tenir compte dans la fonction "fonctionTexte"
     
            global $derniereBaliseRencontree;
     
            $derniereBaliseRencontree = $nomBalise;
        }
     
        // Ma propre fonction de traitement des balises fermantes
        function fonctionBaliseFermante($parseur, $nomBalise)
        {
            // On oublie la dernière balise rencontrée
            global $derniereBaliseRencontree;
     
            $derniereBaliseRencontree = "";
        }
     
        // Ma propre fonction de traitement du texte
        // qui est appelée par le "parseur"
        function fonctionTexte($parseur, $texte)
        {
            global $derniereBaliseRencontree;
     
            // Selon les cas, nous affichons le texte
            // ou nous proposons un lien
            // ATTENTION: Par défaut les noms des balises sont
            //            mises en majuscules
     
     
     
            switch ($derniereBaliseRencontree) {
                case "DATE": 
                    echo $texte. " : " ;
                    break;
            } 
    		 switch ($derniereBaliseRencontree) {
                case "VITESSEVENTMAX": 
                    echo $texte. " km/h <br><br>" ;
                    break;
     
            }         
        }
     
        // Création du parseur XML
        $parseurXML = xml_parser_create();
     
        // Je précise le nom des fonctions à appeler
        // lorsque des balises ouvrantes ou fermantes sont rencontrées
        xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante"
                                           , "fonctionBaliseFermante");
     
        // Je précise le nom de la fonction à appeler
        // lorsque du texte est rencontré
        xml_set_character_data_handler($parseurXML, "fonctionTexte");
     
        // Ouverture du fichier
        $fp = fopen($fichier, "r");
        if (!$fp) die("Impossible d'ouvrir le fichier XML");
     
        // Lecture ligne par ligne
        while ( $ligneXML = fgets($fp, 1024)) {
            // Analyse de la ligne
            // REM: feof($fp) retourne TRUE s'il s'agit de la dernière
            //      ligne du fichier.
            xml_parse($parseurXML, $ligneXML, feof($fp)) or
                die("Erreur XML");
        }
     
        xml_parser_free($parseurXML);
        fclose($fp);
    ?>
    Qui marche très bien mais m'affiche les valeurs de tout le fichier ....
    il ne manque que la sélection du bon noeud, que je n'arrive pas a faire

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Je sais qu'on dit beaucoup de mal de W3School mais je trouve que c'est encore eux qui ont l'article le plus abordable concernant les XPaths: http://www.w3schools.com/xpath/xpath_examples.asp

    Bref, pour séléctionner les idbalises avec une valeur de 10, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //releve[idbalise=10]/idbalise
    ou our réccupérer les noeuds "releve"
    Voici un exemple rapide:
    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
    $xml = <<< XML
    <?xml version="1.0" ?>
    <root>
    <releve>
    <idbalise>10</idbalise>
    <date>2011-08-03 17:38:36</date>
    <vitesseVentMoy>9</vitesseVentMoy>
    <vitesseVentMax>18</vitesseVentMax>
    <vitesseVentMin>0</vitesseVentMin>
    <directVentMoy>0</directVentMoy>
    <directVentInst>0</directVentInst>
    <temperature>10</temperature>
    <hydrometrie />
    <pression />
    <luminosite />
    </releve>
    <releve>
    <idbalise>11</idbalise>
    <date>2011-08-03 17:28:08</date>
    <vitesseVentMoy>9</vitesseVentMoy>
    <vitesseVentMax>22</vitesseVentMax>
    <vitesseVentMin>0</vitesseVentMin>
    <directVentMoy>67</directVentMoy>
    <directVentInst>45</directVentInst>
    <temperature>20</temperature>
    <hydrometrie />
    <pression />
    <luminosite />
    </releve>
    </root>
    XML;
     
    $doc = new DOMDocument();
    $doc->loadXML($xml);
     
    $xpath = new DOMXPath($doc);
    foreach ($xpath->query('//releve[idbalise=10]') as $node) {
      foreach ($node->childNodes as $child_node) {
        if (!$child_node instanceof DOMText)
          echo "$child_node->nodeName > $child_node->nodeValue<br />";
      }
    }

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 48
    Points : 26
    Points
    26
    Par défaut
    Merci bcp pour ton aide.

    Si je veux remplacer le code xml inclu dans ton exemple par la lecture d'un fichier depuis adresse http, je tente un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $xmlStr = file_get_contents('http://blabla/relevemeteo.xml'); 
    $xml = new SimpleXMLElement($xmlStr); 
     
    $doc = new DOMDocument();
    $doc->loadXML($xml);

    ... qui ne marche pas :/

    ça me paraissait pourtant simple, mais j'ai essayé plein de manière différente, et j'ai a chaque fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: DOMDocument::loadXML() [domdocument.loadxml]: Empty string supplied as input in /home/blabla/from_xml.php on line 100
    L'ouverture d'un fichier n'est pas si simple ?

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Utilise directement DOMDocument::load.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $doc = new DOMDocument;
    $doc->load('http://...');
    Voir:
    - DOMDocument
    - DOMXPath

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 48
    Points : 26
    Points
    26
    Par défaut
    Super

    Merci encore, pour la suite (... création de flux rss dynamique, multi relevés, personnalisable), je vais me débrouiller avec ce que j'avais déjà fait depuis une db.

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tu peux te servir des classes d'Axiom pour générer les flux RSS: http://code.google.com/p/php-axiom/ (voir /libraries/feeds/)

    Tu peux te créer un adaptateur par dessus pour charger les données dans un flux à partir de la db ou d'un XML et comme ça se sera bien flexible :p

    Tu peux également générer un RSS à partir d'un XML avec une XSLT tout simplement.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 48
    Points : 26
    Points
    26
    Par défaut
    Ok, Merci popur tes conseils.

    Finalement le code généré ressemble a ça :

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="http://rss.feedsportal.com/xsl/fr/rss.xsl"?>
    <rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" version="2.0">
    <channel>
    <title>Balise Meteo
    </title>
    <link></link>
    <description></description>
    <language>fr</language>
    <copyright></copyright>
    <ttl>5</ttl><item>
    <title>61 le 2011-08-04 18:46:32</title>
    <description>Vent moyen/5mn : 45 - 1 &lt;br /&gt; Maxi/H : 45 - 6 &lt;br /&gt; Mini/H : 0 &lt;br /&gt; Temp : 25 &lt;br /&gt; </description>
    </item>
    </channel>
    </rss>
    Sauf que l'URL pour s'abonner au flux ressemble a ça :

    http://blablabla.org/generate_rss/rss/rss_62.php

    Et c'est la que ça fait souci .... le lecteur RSS est abonné a une page PHP qui génère du XML conforme RSS, mais le flux RSS ne s'actualise pas seul !!
    Sans doute car la page PHP, elle, ne change jamais, elle génère du XML sur demande, et on dirait que le lecteur ne demande pas ... sans doute a cause du fait que le code PHP, lui, est tjrs le même >>>> pas de changement, pas d'actualisation ??? :/ le code XML généré aurait pourtant changé.

    euhh ... je sais pas si c'est clair Mais ça me fait souci car je ne vois pas comment résoudre ce problème.

    En gros, si je click sur "actualiser", le flux est re-généré et se met à jour, si je ne click pas sur le bouton, rien ne se passe.... dommage, je voudrais recevoir les màj toute les 20 mn, direct ds le lecteur RSS de mon tél. Comme tout les autres flux RSS .....

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

Discussions similaires

  1. Lire plusieurs noeuds XML
    Par Abac_Angelique dans le forum Débuter
    Réponses: 1
    Dernier message: 18/10/2013, 09h55
  2. [Débutant] Lire un noeud xml particulier
    Par Veidt dans le forum Windows Phone
    Réponses: 4
    Dernier message: 11/09/2012, 00h33
  3. lire un fichier XML avec des noeuds, enfants, etc
    Par thor76160 dans le forum C#
    Réponses: 23
    Dernier message: 04/09/2009, 15h14
  4. Xml - Lire un noeud.
    Par G_angel dans le forum C#
    Réponses: 9
    Dernier message: 22/06/2007, 14h26
  5. XSL ne parvient pas à lire les noeuds XML ??
    Par yahn dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2004, 19h29

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