получить доступ к элементам и атрибутам ПРЯМО, используя lxml etree - PullRequest
0 голосов
/ 06 октября 2018

Учитывая следующую структуру xml:

<root>
    <a>
        <from name="abc">
            <b>xxx</b>
            <c>yyy</c>
        </from>
        <to name="def">
            <b>blah blah</b>
            <c>another blah blah</c>
        </to>
    </a>
</root>

Как я могу получить прямой доступ к значению «from.b» каждого «a», не загружая сначала «from» (с find ()) каждого"a"?

Как видите, под "from" и "to" есть абсолютно одинаковые элементы.Таким образом, метод findall () не будет работать, так как я должен различать, откуда исходит значение «b».

Я хотел бы получить метод прямого доступа, потому что, если мне нужно загрузить каждый дочерний элемент(есть много) мой код был бы довольно многословным.Кроме того, в моем случае показатели производительности и у меня есть много документов XML для анализа!Поэтому мне нужно найти самый быстрый способ пройти через документ (и сохранить данные в БД)

Внутри каждого элемента "a" есть ровно 1 элемент "from", а внутри каждого элемента "from"это ровно 1 элемент "b".

У меня нет проблем, чтобы сделать это с lxml objectify, но я хочу использовать etree, потому что сначала я должен проанализировать документ XML с etree, потому что сначала я должен проверить xmlсхема против документа XSD, и я не хочу повторно анализировать весь документ снова.

1 Ответ

0 голосов
/ 06 октября 2018

findfindall) позволяет также указать путь к элементам, например, вы можете сделать:

root = ET.fromstring(input_xml)

for a in root.findall('a'):
    print(a, a.find('from/b').text)

при условии, что у вас всегда есть ровно один from и b element.

в противном случае у меня может возникнуть соблазн использовать findall и выполнять проверки в коде Python, если он предназначен для повышения надежности

...