Разбор XML в Python с использованием примера ElementTree
Мне трудно найти хороший, базовый пример того, как разобрать XML в python с помощью Element Tree. Из того, что я могу найти, это, кажется, самая простая библиотека для анализа XML. Вот образец XML, с которым я работаю:
<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>
Я могу делать то, что мне нужно, используя жестко закодированный метод. Но мне нужно, чтобы мой код был более динамичным. Вот что сработало:
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
Вот несколько вещей, которые я попробовал, но ни одна из них не сработала, сообщив, что они не смогли найти timeSeries (или что-нибудь еще, что я пробовал):
tree = ET.parse(sample.xml)
tree.find('timeSeries')
tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')
По сути, я хочу загрузить XML-файл, выполнить поиск по тегу timeSeries и выполнить итерации по тегам значения, возвращая dateTime и значение самого тега; все, что я делаю в приведенном выше примере, но не сложно кодировать интересующие меня разделы xml. Может кто-нибудь указать мне на некоторые примеры или дать мне несколько советов о том, как работать с этим?
Спасибо за помощь. Использование обоих приведенных ниже предложений сработало над предоставленным мною файлом примера, однако они не сработали с полным файлом. Вот ошибка, которую я получаю из реального файла, когда я использую метод Эда Карреля:
(<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)
Я подумал, что в реальном файле есть что-то, что ему не нравится, поэтому постепенно удалял все, пока оно не заработало. Вот строки, которые я изменил:
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>
Удаление атрибутов с xsi: ... решило проблему. «Xsi: ...» не является допустимым XML? Мне будет трудно удалить их программно. Любые предлагаемые обходные пути?
Вот полный XML-файл:http://www.sendspace.com/file/lofcpt
Когда я изначально задавал этот вопрос, я не знал о пространствах имен в XML. Теперь, когда я знаю, что происходит, мне не нужно удалять атрибуты "xsi", которые являются объявлениями пространства имен. Я просто включаю их в свои поиски xpath. Видетьэта страница для получения дополнительной информации о пространствах имен в lxml.