在etree上使用iterdescendants()时,可以修改树吗?

时间:2011-08-06 00:20:45

标签: python xml parsing python-3.x lxml

(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 个答案:

答案 0 :(得分:1)

我有以下代码代替你的代码,它似乎工作,删除所有子元素。我使用iterfind查找带有标记的所有后代并删除它们。

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