При использовании iterdescendants () в etree можно ли изменять дерево? - PullRequest
1 голос
/ 06 августа 2011

(Python 3.2)

Я использую etree для анализа XML.Для этого я рекурсивно перебираю документ с iterdescendants().Итак, что-то вроде:

for elem in doc.iterdescendants():
    if elem.tag == "tag":
        pass # Further processing

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

В моем начальном тестировании я пробовал:

for child in elem.getchildren(): child.clear()

По какой-то причине это приводит к тому, что элемент сразу после обработки elem обрабатывается,Как будто элемент также удаляется.

Затем я попробовал это, что работает (в том смысле, что он удаляет родителя и его потомков, но не приводит к тому, что любые последующие братья и сестры родителя будут пропущены / затронуты).а также):

elem.clear()

Может кто-нибудь пролить свет на это?Спасибо,

1 Ответ

1 голос
/ 06 августа 2011

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

for element in doc.iterfind('.//%s'%tag):
    element.getparent().remove(element)
...