Стандартная реализация ElementTree для Python (2.6) не предоставляет указателей родителям из дочерних узлов.Поэтому, если нужны родители, рекомендуется перебирать родителей, а не детей.
Учтите, что мой 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 предполагает, что метод getiterator () выполняетПервый поиск.Запуск его без поиска родителя (1) приводит к:
first
second
third
Однако, извлекая текст из параграфов (3), получается:
first, Content>Para
third, Content>Para
second, Table>Para
Это выглядит как ширинаfirst.
Поэтому возникает два вопроса.
- Это правильное и ожидаемое поведение?
- Как вы извлекаете (родитель, ребенок) кортежи, когда ребенок долженбыть определенного типа, но родитель может быть любым, , если порядок документа должен поддерживаться .Я не думаю, что выполнение двух циклов и отображение (родительского, дочернего), генерируемого (3), в порядки, генерируемые (1), является идеальным.