为什么ElementTree.Element.remove()方法不能与直接迭代正确工作?



我正在用Python编辑XML文件XML .etree. elementtree。下面是一个简单的文件示例:

<root>
<sub1>1</sub1>
<sub2>2</sub2>
</root>

我想删除所有的根子元素。当我使用

...
for child in root:
root.remove(child)
...

'remove'方法只删除第一个子元素。但随着

...
for child in root.getchildren():
root.remove(child)
...

适用于所有子元素。为什么会发生这种情况?是一些迭代器特性,还是我需要更多地了解'remove'方法?

是的,如果你使用for child in root:,它就是一个迭代器并且不建议使用iterator方法从容器中移除item。你应该为循环生成一个列表。

在你的第一个删除操作(使用迭代器)中,它实际上删除了所有奇数子元素(索引0,2,4,…),并在根元素中保留所有偶数子元素。您可以使用一个简单的列表来尝试这种行为:

l = [1,2,3,4,5,6]
for x in l:
l.remove(x)
print (l)

输出
[2, 4, 6]

您可以在XML中尝试添加一个<sub3>元素,并观察到类似的结果。

根据这里的官方更新日志,getchildren方法已经被弃用了。

建议使用:

for child in list(root):
# do something 

最新更新