найти путь с ElementTree - PullRequest
       7

найти путь с ElementTree

0 голосов
/ 26 марта 2020

Wih ElementTree , я могу распечатывать все вхождения указанного тега c (в моем случае ExpertSettingsSg):

#!/usr/bin/env python3

import xml.etree.ElementTree as ET

root = ET.parse('mydoc.xml').getroot()

for children in root:
    value=children.findall('.//ExpertSettingsSg')#tag I'm looking for
    for settings in value:
        if settings.text is not None:
            print(settings.text)

Но я не нашел способа распечатать путь вхождения. Поскольку мой файл XML имеет много уровней и поскольку ExpertSettingsSg может быть практически на каждом уровне, мне нужно знать, откуда взялся ExpertSettingsSg. Я ищу что-то вроде

Путь к конфигурации xxxxxx = / root / xxx / aaaa / bbbb

Если это невозможно с ElementTree, любая другая библиотека делает трюк?

Спасибо

1 Ответ

1 голос
/ 28 марта 2020

Вместо ElementTree следует использовать l xml, который имеет getpath метод.

Пример: в качестве источника XML Я использовал:

txt ='''<main>
  <x>
    <a>
      <ExpertSettingsSg id="1">x1</ExpertSettingsSg>
    </a>
    <b>
      <dummy>xxxx</dummy>
    </b>
  </x>
  <y>
    <c>
      <dummy>xxxx</dummy>
    </c>
    <d>
      <ExpertSettingsSg id="2">x2</ExpertSettingsSg>
    </d>
    <e>
      <ExpertSettingsSg id="3"/>
    </e>
  </y>
</main>'''

Код:

from lxml import etree as et

tree = et.fromstring(txt)
root = tree.getroottree()

for node in root.findall('.//ExpertSettingsSg'):
    tt = node.text
    if tt is not None:
        print(node.attrib['id'], tt, root.getpath(node))

Результат:

1 x1 /main/x/a/ExpertSettingsSg
2 x2 /main/y/d/ExpertSettingsSg
...