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

1 投票
1 回答
961 浏览
提问于 2025-04-16 23:00

(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

我用了一段代码替代了你的代码,结果发现它可以正常工作,能够删除所有的子元素。我使用了iterfind这个方法来找到所有带有特定标签的后代元素,并将它们删除。

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

撰写回答