Python 在etree上使用ITerDescents()时,是否可以修改树?
(Python 3.2) 我正在使用Python 在etree上使用ITerDescents()时,是否可以修改树?,python,xml,parsing,python-3.x,lxml,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.getchildre
etree
解析一些XML。为此,我使用iterdescendants()
递归地遍历文档。比如说:
for elem in doc.iterdescendants():
if elem.tag == "tag":
pass # Further processing
有时,我处理一个父标记,其中包含我希望在以后的递归中阻止处理的子标记。摧毁孩子们可以吗
在我的初始测试中,我尝试了:
for child in elem.getchildren(): child.clear()
出于某种原因,这会导致elem
之后的元素立即被处理。就像元素也被移除了一样
然后我尝试了这个方法,效果很好(因为它删除了父级及其子级,但不会导致父级的任何后续兄弟姐妹也被跳过/影响):
有人能解释一下吗?谢谢,我用下面的代码代替了你的代码,删除了所有的子元素,看起来很有效。我使用iterfind查找带有标记的所有子体并删除它们
for element in doc.iterfind('.//%s'%tag):
element.getparent().remove(element)
我用下面的代码代替了你的代码,删除了所有的子元素,看起来很有效。我使用iterfind查找带有标记的所有子体并删除它们
for element in doc.iterfind('.//%s'%tag):
element.getparent().remove(element)
如果你这样做,我相信行为是未定义的。如果你这样做,我相信行为是未定义的。我也相信我已经弄明白了为什么这样做有效(而我的其他方法没有)。在
iterparse
和iterwalk
的描述中,lxml文档描述了您可以在end
事件后修改正在迭代的树。事件只适用于iterparse和iterwalk,但我认为它也适用于这里。如果当前正在迭代某个元素,则不应触摸它。但是,您可以自由修改它的childrenAn替代方法可能是使用doc.xpath('./%s'%tag')来获取要删除的项的列表。我还相信我已经找到了为什么这样做的原因(而我的其他方法没有)。在iterparse
和iterwalk
的描述中,lxml文档描述了您可以在end
事件后修改正在迭代的树。事件只适用于iterparse和iterwalk,但我认为它也适用于这里。如果当前正在迭代某个元素,则不应触摸它。但是,您可以自由修改它的childrenAn替代方法可能是使用doc.xpath('./%s'%tag')来获取要删除的项的列表。