Парсинг XML в использовании Python пример ElementTree

У Steve McConnell Код, Завершенный , есть, как обычно, некоторый превосходный совет в этом отношении. Соответствующие страницы (в первом выпуске так или иначе) 340 и 341. Определенно советуйте любому, кто интересуется улучшением их кодирования цикла, чтобы посмотреть на это. McConnell рекомендует значимые имена счетчика цикла, но люди должны считать то, что он получен для высказывания себя вместо того, чтобы полагаться на мою слабую сводку.

62
задан Bill the Lizard 3 October 2017 в 14:29
поделиться

2 ответа

Итак, теперь у меня на компьютере установлено ElementTree 1.2.6, и я запустил следующий код для отправленного вами XML-фрагмента:

import elementtree.ElementTree as ET

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

print thingy.attrib

и получил в ответ следующее:

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

Похоже, нашел элемент timeSeries без необходимости использования числовых индексов.

Теперь было бы полезно знать, что вы имеете в виду, когда говорите «это не работает». Поскольку он работает для меня с тем же вводом, маловероятно, что ElementTree каким-то очевидным образом сломан. Добавьте в свой вопрос любые сообщения об ошибках, обратные трассировки или все, что вы можете предоставить, чтобы помочь нам вам помочь.

46
ответ дан 24 November 2019 в 16:53
поделиться

Если я правильно понимаю ваш вопрос:

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

или если вы предпочитаете (и если имеется только одно вхождение timeSeries / values ​​:

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

findall () метод возвращает список всех совпадающих элементов, тогда как find () возвращает только первый совпадающий элемент. Первый пример перебирает все найденные элементы, второй - дочерние элементы элемент values ​​, в данном случае приводящий к тому же результату.

Я не вижу, откуда возникает проблема, связанная с тем, что не удается найти timeSeries . Возможно, вы просто забыли getroot () ? (Обратите внимание, что он вам действительно не нужен, потому что вы также можете работать из самого дерева элементов,если вы измените выражение пути, например, на / timeSeriesResponse / timeSeries / values ​​ или // timeSeries / values ​​)

21
ответ дан 24 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: