Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在etree上使用ITerDescents()时,是否可以修改树?_Python_Xml_Parsing_Python 3.x_Lxml - Fatal编程技术网

Python 在etree上使用ITerDescents()时,是否可以修改树?

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

(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
之后的元素立即被处理。就像元素也被移除了一样

然后我尝试了这个方法,效果很好(因为它删除了父级及其子级,但不会导致父级的任何后续兄弟姐妹也被跳过/影响):


有人能解释一下吗?谢谢,

我用下面的代码代替了你的代码,删除了所有的子元素,看起来很有效。我使用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')来获取要删除的项的列表。