Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/08/2011, 11h05   #1
Invité régulier
 
Inscription : novembre 2004
Messages : 45
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 45
Points : 7
Points : 7
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 :

Citation:
<?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 :
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
ReaseT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 11h09   #2
Invité régulier
 
Inscription : novembre 2004
Messages : 45
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 45
Points : 7
Points : 7
J'avais également essayé ce morceau de code :

Code :
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
ReaseT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 11h55   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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 :
//releve[idbalise=10]/idbalise
ou our réccupérer les noeuds "releve"
Voici un exemple rapide:
Code :
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 />";
  }
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 12h29   #4
Invité régulier
 
Inscription : novembre 2004
Messages : 45
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 45
Points : 7
Points : 7
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 :
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 :
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 ?
ReaseT est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/08/2011, 12h35   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Utilise directement DOMDocument::load.

Code :
1
2
$doc = new DOMDocument;
$doc->load('http://...');
Voir:
- DOMDocument
- DOMXPath
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 13h20   #6
Invité régulier
 
Inscription : novembre 2004
Messages : 45
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 45
Points : 7
Points : 7
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.
ReaseT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 13h49   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 19h00   #8
Invité régulier
 
Inscription : novembre 2004
Messages : 45
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 45
Points : 7
Points : 7
Ok, Merci popur tes conseils.

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

Code :
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 .....
ReaseT est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h29.


 
 
 
 
Partenaires

Hébergement Web