Przetwarzanie XML w Pythonie przy użyciu przykładu ElementTree

Trudno mi znaleźć dobry, podstawowy przykład tego, jak analizować XML w pythonie za pomocą drzewa elementów. Z tego, co mogę znaleźć, wydaje się, że jest to najłatwiejsza biblioteka do przetwarzania XML. Oto przykład XML, z którym pracuję:

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

Jestem w stanie zrobić to, czego potrzebuję, za pomocą metody kodowanej na stałe. Ale potrzebuję mojego kodu, aby był nieco bardziej dynamiczny. Oto, co zadziałało:

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

Oto kilka rzeczy, które próbowałem, żaden z nich nie zadziałał, informując, że nie mogli znaleźć TimeSeries (ani niczego innego, co próbowałem):

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

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

Zasadniczo chcę załadować plik xml, wyszukać tag timeSeries i przejść przez znaczniki wartości, zwracając dateTime i wartość samego znacznika; wszystko, co robię w powyższym przykładzie, ale nie twarde kodowanie sekcji xml, które mnie interesują. Czy ktoś może mi wskazać kilka przykładów lub dać mi kilka sugestii, jak to zrobić?

Dziękuję za całą pomoc. Korzystając z obu poniższych sugestii dotyczących przykładowego pliku, który udostępniłem, nie działały one w pełnym pliku. Oto błąd, który otrzymuję z prawdziwego pliku, gdy używam metody Eda Carrela:

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

Doszedłem do wniosku, że w prawdziwym pliku jest coś, co mu się nie podobało, więc stopniowo usuwałam rzeczy, aż zadziałało. Oto linie, które zmieniłem:

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>

Usunięcie atrybutów, które mają 'xsi: ...', rozwiązało problem. Czy „xsi: ...” nie jest poprawnym XML? Trudno będzie mi je usunąć programowo. Jakieś sugerowane obejścia?

Oto pełny plik XML:http://www.sendspace.com/file/lofcpt

Kiedy pierwotnie zadałem to pytanie, nie byłem świadomy przestrzeni nazw w XML. Teraz, gdy wiem, co się dzieje, nie muszę usuwać atrybutów „xsi”, które są deklaracjami przestrzeni nazw. Po prostu włączam je do moich wyszukiwań xpath. Widziećta strona więcej informacji o przestrzeniach nazw w lxml.

questionAnswers(2)

yourAnswerToTheQuestion