Frage

Ich habe eine harte Zeit, um eine gute zu finden, einfaches Beispiel, wie XML in Python zu analysieren Elementstruktur verwenden. Von dem, was ich finden kann, erscheint dies für das Parsen von XML die einfachste Bibliothek zu verwenden sein. Hier ist ein Beispiel der XML Ich arbeite mit:

<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>

Ich bin in der Lage zu tun, was ich brauche, eine hartcodierte Methode. Aber ich brauche meinen Code ein bisschen mehr Dynamik. Hier ist, was funktioniert:

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

Hier sind ein paar Dinge, die ich versucht habe, keiner von ihnen arbeitete, berichten, dass sie nicht Zeitreihe (oder etwas anderes habe ich versucht) finden konnte:

tree = ET.parse(sample.xml)
tree.find('timeSeries')

tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')

Im Grunde möchte ich die XML-Datei laden, für den Zeitreihen-Tag suchen, und durchlaufe den Wert Tags, die Datums- und Uhrzeit Rückkehr und den Wertes des Tags selbst; alles, was ich in dem obigen Beispiel zu tun, aber nicht hart Codierung der Abschnitte von xml mich interessiert. Kann mir jemand Punkt mich auf einige Beispiele, oder geben Sie mir einige Vorschläge, wie man Arbeit durch das?


Vielen Dank für die Hilfe. Mit den beiden die folgenden Vorschläge auf der Beispieldatei habe ich zur Verfügung gestellt, jedoch haben sie nicht weiter auf die vollständige Datei. Hier ist der Fehler, den ich aus der realen Datei, wenn ich Ed Carrel Methode verwenden:

 (<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)

Ich dachte, es war etwas in der realen Datei wie es nicht, so inkrementell Ich entfernte Dinge, bis es funktionierte. Hier sind die Zeilen, die ich geändert:

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>

die Attribute entfernen, in denen 'xsi: ...' das Problem behoben. Ist das 'xsi: ...' nicht gültig XML? Es ist schwer für mich, diese programmatisch zu entfernen. Irgendwelche vorgeschlagenen Workarounds?

Hier ist die vollständige XML-Datei: http://www.sendspace.com/file/lofcpt


Als ich ursprünglich diese Frage gestellt, ich war von Namespaces in XML nicht bewusst. Nun, da ich weiß, was los ist, ich habe nicht die „xsi“ Attribute zu entfernen, die die Namespace-Deklarationen sind. Ich schließe sie nur in meinem XPath sucht. Siehe Seite für weitere Informationen auf Namespaces in lxml.

War es hilfreich?

Lösung

Also ich ElementTree 1.2.6 auf meine Box jetzt haben, und lief den folgenden Code für das XML-Chunk Sie auf dem Laufenden:

import elementtree.ElementTree as ET

tree = ET.parse("test.xml")
doc = tree.getroot()
thingy = doc.find('timeSeries')

print thingy.attrib

und bekam folgende zurück:

{'name': 'NWIS Time Series Instantaneous Values'}

Es erscheint die Zeitreihe Element gefunden zu haben, ohne numerischen Indizes zu verwenden.

Was jetzt nützlich sein würde, ist zu wissen, was Sie meinen, wenn Sie sagen, „es nicht funktioniert.“ Da es für mich die gleiche Eingabe gegeben funktioniert, ist es unwahrscheinlich, dass ElementTree in einigen offensichtlichen Art und Weise gebrochen. Aktualisieren Sie Ihre Frage mit Fehlermeldungen, Backtraces, oder alles, was Sie helfen können Sie uns helfen.

Andere Tipps

Wenn ich verstehe Ihre Frage richtig:

for elem in doc.findall('timeSeries/values/value'):
    print elem.get('dateTime'), elem.text

oder, wenn Sie bevorzugen (und wenn es nur ein Vorkommen von timeSeries/values:

values = doc.find('timeSeries/values')
for value in values:
    print value.get('dateTime'), elem.text

Die findall() Methode liefert eine Liste aller passenden Elemente, während find() gibt nur das erste Anpassungselement. Die ersten Beispiel Schleifen über alle gefundenen Elemente, die zweite Schleife über die untergeordneten Elemente des values Element, in diesem Fall zu dem gleichen Ergebnis führt.

Ich sehe nicht, wo das Problem mit nicht timeSeries findet aus jedoch kommt. Vielleicht haben Sie vergessen einfach den getroot() Anruf? (Beachten Sie, dass Sie nicht wirklich brauchen, weil Sie von der elementtree arbeiten kann sich auch, wenn Sie den Ausdruck Pfad ändern, um zum Beispiel /timeSeriesResponse/timeSeries/values oder //timeSeries/values)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top