J'ai du mal à trouver un bon exemple de base pour analyser XML en python à l'aide d'Element Tree. D'après ce que je peux trouver, cela semble être la bibliothèque la plus facile à utiliser pour analyser XML. Voici un exemple de XML Je travaille avec:Analyse XML en Python à l'aide de l'exemple ElementTree
<timeSeriesResponse>
<queryInfo>
<locationParam>01474500</locationParam>
<variableParam>99988</variableParam>
<timeParam>
<beginDateTime>2009-09-24T15:15:55.271</beginDateTime>
<endDateTime>2009-11-23T15:15:55.271</endDateTime>
</timeParam>
</queryInfo>
<timeSeries name="NWIS Time Series Instantaneous Values">
<values count="2876">
<value dateTime="2009-09-24T15:30:00.000-04:00" qualifiers="P">550</value>
<value dateTime="2009-09-24T16:00:00.000-04:00" qualifiers="P">419</value>
<value dateTime="2009-09-24T16:30:00.000-04:00" qualifiers="P">370</value>
.....
</values>
</timeSeries>
</timeSeriesResponse>
Je suis capable de faire ce que je dois, en utilisant une méthode codée en dur. Mais j'ai besoin que mon code soit un peu plus dynamique. Voici ce qui a fonctionné:
tree = ET.parse(sample.xml)
doc = tree.getroot()
timeseries = doc[1]
values = timeseries[2]
print child.attrib['dateTime'], child.text
#prints 2009-09-24T15:30:00.000-04:00, 550
Voici quelques choses que j'ai essayé, aucun d'entre eux travaillaient, les rapports qu'ils ne pouvaient pas trouver TimeSeries (ou toute autre chose que j'ai essayé):
tree = ET.parse(sample.xml)
tree.find('timeSeries')
tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')
Fondamentalement, je veux charger le fichier xml, rechercher la balise timeSeries, et parcourir les balises de valeur, en retournant le dateTime et la valeur de la balise elle-même; tout ce que je fais dans l'exemple ci-dessus, mais pas de coder les sections de xml qui m'intéressent. Est-ce que quelqu'un peut me donner des exemples, ou me donner quelques suggestions sur la façon de travailler?
Merci pour toute l'aide. En utilisant les deux suggestions ci-dessous a travaillé sur le fichier d'exemple que j'ai fourni, cependant, ils n'ont pas travaillé sur le fichier complet. Voici l'erreur que je reçois du fichier réel lorsque j'utilise la méthode de Ed Carrel:
(<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)
je me suis dit il y avait quelque chose dans le fichier réel, il n'a pas aimé, donc j'enlevé les choses incremently jusqu'à ce qu'il a travaillé. Voici les lignes que je changé:
originally: <timeSeriesResponse xsi:schemaLocation="a URL I removed" xmlns="a URL I removed" xmlns:xsi="a URL I removed">
changed to: <timeSeriesResponse>
originally: <sourceInfo xsi:type="SiteInfoType">
changed to: <sourceInfo>
originally: <geogLocation xsi:type="LatLonPointType" srs="EPSG:4326">
changed to: <geogLocation>
Suppression des attributs qui ont « xsi: ... » résolu le problème. Le 'xsi: ...' n'est-il pas valide? Il sera difficile pour moi de les supprimer par programme. Avez-vous des suggestions de travail?
Voici le fichier XML complet: http://www.sendspace.com/file/lofcpt
Quand j'ai demandé à l'origine de cette question, je ne connaissais pas de XML dans les espaces de noms. Maintenant que je sais ce qui se passe, je n'ai pas besoin de supprimer les attributs "xsi", qui sont les déclarations d'espace de noms. Je les inclus simplement dans mes recherches xpath. Voir this page pour plus d'informations sur les espaces de noms dans lxml.
Je pourrais vous suggérer de consulter le module 'etree' fourni par' lxml'? Je l'ai découvert récemment et je l'ai trouvé largement supérieur à ElementTree. Il a été écrit comme un remplacement qui émule complètement ElementTree. – jathanism
J'ai fini par utiliser lxml, car c'était un peu plus facile de travailler avec, mais j'ai toujours le problème décrit ci-dessus. Pour une solution de contournement, je scanne au préalable le fichier xml et supprime toutes les instances de "xsi: type". Les méthodes décrites dans les réponses ci-dessous fonctionnent bien. – Casey