xml.etree.ElementTree не находит все элементы в XML - PullRequest
2 голосов
/ 22 марта 2019

У меня есть следующий XML-файл, который я пытаюсь перебрать с помощью xml.etree:

<safetypadapiresponse><url></url><refcode /><status>SUCCESS</status><message><pcrs>
  <pcr>
    <eCase01m>1234</eCase01m>
    <eProcedures03>12 Lead ECG Obtained</eProcedures03>
    <eMedications03>Oxygen</eMedications03>
  </pcr>
</pcrs></message></safetypadapiresponse>

Я не могу найти ни одного дочернего элемента после 'message' со следующим:

import xml.etree.ElementTree as ET

tree = ET.parse(xmlFile)
root = tree.getroot()

for member in root.findall('pcr'):
  print(member)

Следующие дочерние элементы отображаются при запуске следующего:

for member in root:
  print(member)
  • Элемент 'url'
  • Элемент 'refcode'
  • Элемент 'status'
  • Элемент 'message'

Я пытаюсь получить всю информацию в элементе pcr (то есть eCase01m, eProcedures03, eMedications03).

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Ради полноты позвольте мне добавить, что вы также можете попробовать xpath:

for i in tree.xpath('*//pcr/*'):
print(i.tag)

Вывод:

eCase01m
eProcedures03
eMedications03
1 голос
/ 22 марта 2019

Вы можете использовать findall() двумя способами.Бесполезно это упоминается в двух различных частях из документов :

Element.findall () находит только элементы с тегом, которые являются прямыми потомкамитекущий элемент.

...

Находит все соответствующие подэлементы по имени тега или пути.Возвращает список, содержащий все соответствующие элементы в порядке документа.

Это означает, что если вы ищете тег, вы ищете только direct потомков текущего элемента.

Вместо этого вы можете использовать XPath для поиска интересующих вас частей, которые будут просматриваться в документах, ищущих совпадения.Любое из следующего должно сделать:

root.findall('./message/pcrs/pcr')  # Find them relative to this node
root.findall('.//pcr')  # Find them anywhere below the current node
...