我正在用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