У Steve McConnell Код, Завершенный , есть, как обычно, некоторый превосходный совет в этом отношении. Соответствующие страницы (в первом выпуске так или иначе) 340 и 341. Определенно советуйте любому, кто интересуется улучшением их кодирования цикла, чтобы посмотреть на это. McConnell рекомендует значимые имена счетчика цикла, но люди должны считать то, что он получен для высказывания себя вместо того, чтобы полагаться на мою слабую сводку.
Итак, теперь у меня на компьютере установлено 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 каким-то очевидным образом сломан. Добавьте в свой вопрос любые сообщения об ошибках, обратные трассировки или все, что вы можете предоставить, чтобы помочь нам вам помочь.
Если я правильно понимаю ваш вопрос:
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
)