xml.etree.ElementTree не находит все элементы в XML

#python #xml #xml.etree

#python #xml #xml.etree

Вопрос:

У меня есть следующий 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’
  • ‘Статус’ элемента
  • Элемент ‘message’

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. Спасибо @JonBetts, это именно то, что мне было нужно.

Ответ №2:

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

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

Вывод:

 eCase01m
eProcedures03
eMedications03