在etree上使用iterdescendants()时,修改树是可以的吗?
(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)