Python XML ElementTree - findall - PullRequest
       23

Python XML ElementTree - findall

0 голосов
/ 01 апреля 2020

Я работаю с XML файлами. Мой файл выглядит так:

import xml.etree.ElementTree as ET

xml = '''
<root>
    <query label="nom1" code="1234">
        <where a="1" b="2">
            <condition id="1534" expr="expression1"/>
        </where>
    </query>
    <query label="nom2" code="2345">
        <where a="2" b="3">
            <condition id="6784" expr="expression2"/>
        </where>
    </query>
</root>
'''

myroot = ET.fromstring(xml)

Я хочу иметь метку и expr для каждого запроса. Например, он напечатает меня:

query 1 :
    nom1
    expression1
query 2:
    nom2
    expression2

Вы знаете, как я могу это сделать? Я знаю, как напечатать все этикетки:

for type_tag in myroot.findall('root/query'):
    print(type_tag.attrib['label'])

И как напечатать все expr:

for e in myroot.findall("root/query/.//*[@expr]"):
        print(e.attrib['expr'])

Но я не знаю, как это сделать для обоих одновременно .

Любой комментарий будет полезен!

Хорошего дня:)

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете использовать findall() для поиска относительно соответствующего элемента:

for i, type_tag in enumerate(myroot.findall('./query')):
    print(f'query {i+1}:')
    print(type_tag.attrib['label'])
    for e in type_tag.findall('./where/condition'):
        print(e.attrib['expr'])

# query 1:
# nom1
# expression1
# query 2:
# nom2
# expression2

Пояснения:

  • myroot.findall('./query') даст вам все <query> элементы, начиная с поиск из узла root
  • type_tag.findall('./where/condition') даст вам все <condition> элементы в текущем запросе tpye_tag
...