Chercher la valeur d'un élement dans un fichier xml

BPyhton Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
 fifrelin -
Bonjour,

Je chercher à récupérer les valeurs d'un fichier xml qui se présente ainsi :

<response>
 <version>0.1</version>
 <termsofService>[http://www.wunderground.com/weather/api/d/terms.html</termsofService>]
 <features>
  <feature>hourly10day</feature>
 </features>
 <hourly_forecast>
  <forecast>
  <FCTTIME>
  <hour>10</hour><hour_padded>10</hour_padded><min>00</min><min_unpadded>0</min_unpadded><sec>0</sec><year>2016</year><mon>6</mon><mon_padded>06</mon_padded><mon_abbrev>Jun</mon_abbrev><mday>27</mday><mday_padded>27</mday_padded><yday>178</yday><isdst>1</isdst><epoch>1467014400</epoch><pretty>10:00 AM CEST on June 27, 2016</pretty><civil>10:00 AM</civil><month_name>June</month_name><month_name_abbrev>Jun</month_name_abbrev><weekday_name>Monday</weekday_name><weekday_name_night>Monday Night</weekday_name_night><weekday_name_abbrev>Mon</weekday_name_abbrev><weekday_name_unlang>Monday</weekday_name_unlang><weekday_name_night_unlang>Monday Night</weekday_name_night_unlang><ampm>AM</ampm><tz></tz><age></age><UTCDATE></UTCDATE>
   </FCTTIME>
   <temp>
    <english>70</english>
    <metric>21</metric>
   </temp>
   <dewpoint>
    <english>61</english>
    <metric>16</metric>
   </dewpoint>
   <condition>Clear</condition>
   
   
   <icon>clear</icon>
   <icon_url>[http://icons.wxug.com/i/c/k/clear.gif</icon_url>]
   <fctcode>1</fctcode>
   <sky>25</sky>
   <wspd>
    <english>8</english>
    <metric>13</metric>
   </wspd>
   <wdir>
    <dir>S</dir>
    <degrees>179</degrees>
   </wdir>
   <wx>Mostly Sunny</wx>
   <uvi>3</uvi>
   <humidity>73</humidity>
   <windchill>
    <english>-9999</english>
    <metric>-9999</metric>
   </windchill>
   <heatindex>
    <english>-9999</english>
    <metric>-9999</metric>
   </heatindex>
   
    <feelslike>
     <english>70</english>
     <metric>21</metric>
    </feelslike>
   
   <qpf>
    <english>0.0</english>
    <metric>0</metric>
   </qpf>
   <snow>
    <english>0.0</english>
    <metric>0</metric>
   </snow>
   <pop>0</pop>
   <mslp>
    <english>29.97</english>
    <metric>1015</metric>
   </mslp>
  </forecast>



Le fichier continu ensuite avec des prévisions toutes les heures. Il y a de nouveau la balise "forecast' et les mêmes données que celles présenter ici entre les balises "forecast" et "/forecast"

Mon objectif est de venir récupérer la valeur de température sous la balise "temp", "metric" (ici 21).


Mon code est le suivant :

import urllib
import sys
from xml.dom import minidom


urllib.urlretrieve('http://api.wunderground.com/api/ee112761216338cd/hourly10day/lang:EN/q/France/Carros.xml', '/home/pi/B/Carros.xml') # cette commande me permet d'aller télécharger un fichier

fichierparse= minidom.parse('/home/pi/B/Carros.xml') # je parse monfichier à l'aide de la fonction minidom

## je regarde la première fois ou hour est égale à 0
for h in range(0,24):
    if  int(fichierparse.getElementsByTagName('hour')[h].firstChild.data) == 0: # on cherche la première fois du fichier ou l'heure est égale à minuit
        break  

##je cherche le fils dont le nom est "temp"  
for h in range (0,4):
    if (fichierparse.getElementsByTagName('forecast')[h]).childNodes[h].nodeName == 'temp':

#je lis la valeur du premier enfant de temp 
   resul = fichierparse.getElementsByTagName('temp')[h].firstChild.data 


mais cette commande ne fonctionne pas et je ne comprend pas pourquoi?

pouvez vous m'aider?

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.
A voir également:

1 réponse

fifrelin
 
Salut,

Je pense que la bibliothèque dom de python n'est pas la meilleure, etree est plus simple à manipuler et beaucoup plus intuitif, et surtout permet de faire des requêtes xpath.

D'après ce que tu souhaites, il est alors simple de récupérer les valeurs des noeuds xml désirés.

Exemple simple :

import xml.etree.ElementTree as eltree

xml = eltree.parse('fichier_xmll')
doc = xml.getroot()

nodes = doc.find('hourly_forecast').findall('forecast')

for node in nodes :
hour = node.find('FCTTIME/hour').text
temp = node.find('temp/metric').text

print('hour : {}, temp : {}'.format(hour, temp))


Je te laisse l'adapter à ce que tu souhaites obtenir.
0