Стандартная реализация ElementTree для Python (2.6) не предоставляет указатели родителям из дочерних узлов. Поэтому, если родители необходимы, предлагается зацикливать родителей, а не детей.Итерация нескольких (родительских, дочерних) узлов с использованием Python ElementTree
Рассмотрим мой XML имеет вид:
<Content>
<Para>first</Para>
<Table><Para>second</Para></Table>
<Para>third</Para>
</Content>
Следующая находит все "Para" узлов без учета родителей:
(1) paras = [p for p in page.getiterator("Para")]
Это (адаптировано из effbot) хранит родительский обернув над их вместо дочерних узлов:
(2) paras = [(c,p) for p in page.getiterator() for c in p]
Это имеет смысл и может быть расширенным д с условным для достижения (предположительно) же результата, как (1), но с родительской информацией добавлено:
(3) paras = [(c,p) for p in page.getiterator() for c in p if c.tag == "Para"]
ElementTree documentation предполагает, что метод getiterator() делает поиск в глубине. Запуск без ищет родителя (1) дает:
first
second
third
Однако извлечение текста из пунктов в (3), выходы:
first, Content>Para
third, Content>Para
second, Table>Para
Это по-видимому, в ширину.
В связи с этим возникает два вопроса.
- Это правильное и ожидаемое поведение?
- Как вы извлекаете (родительский, дочерний) кортежи, когда ребенок должен иметь определенный тип, но родитель может быть чем угодно, , если заказ документа должен быть сохранен. Я не думаю, что запуск двух циклов и сопоставление (родительский, дочерний), сгенерированный (3), с порядками, сгенерированными (1), является идеальным.
Спасибо за это решение. знак равно – mmmdreg