Где я должен искать обратный обход дерева lxml.etree?

#python #iterator #lxml #tree-traversal

#python #итератор #lxml #обход дерева

Вопрос:

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

iterdescendants() Метод, похоже, ничего не делает, и iterancestors() метод не входит в подэлементы, он просто переходит вверх и вниз, если вы понимаете, что я имею в виду.

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

1. Можете ли вы привести пример? Как будет выглядеть входной XML и в каком порядке будут проходить элементы?

Ответ №1:

Может быть, что-то вроде этого?

 import lxml.etree as et

xmldata = """
<data>
    <mango>1</mango>
    <kiwi>2</kiwi>
    <banana>3</banana>
    <plum>4</plum>
</data>
"""

tree = et.fromstring(xmldata)

el = tree.find('plum')
print el.text

while True:
    el = el.getprevious()
    if el is None:
        break
    print el.text
 

Результат:

4
3
2
1

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

1. Это не работает. Я не думаю, что я объяснил это слишком хорошо изначально, но в основном он должен getprevious , и если getprevious равно None, он должен getparent , если getoarent равно none, он должен возвращать None . Я написал простую функцию для обработки этого, но это похоже на то, что должно быть встроено, и я ненавижу изобретать колеса.