为什么 ElementTree.Element.remove() 方法在直接迭代时不能正常工作?
Why ElementTree.Element.remove() method is not working correctly with direct iteration?
我正在使用 Python xml.etree.ElementTree 编辑 XML 文件。
这是简单的文件示例:
<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:
它就是一个迭代器
并且不建议使用迭代器方法从其容器中删除项目。您应该为循环生成一个列表。
在您的第一个删除操作(使用迭代器)中,它实际上删除了所有奇数子元素(索引 0、2、4、..)并将所有偶数子元素留在您的根元素中。
您可以使用一个简单的列表尝试该行为:
l = [1,2,3,4,5,6]
for x in l:
l.remove(x)
print (l)
输出
[2, 4, 6]
您可以通过添加 <sub3>
元素在您的 XML 中尝试,并观察类似的结果。
根据此处的 official changelog,getchildren
方法已被弃用。
建议使用:
for child in list(root):
# do something
我正在使用 Python xml.etree.ElementTree 编辑 XML 文件。 这是简单的文件示例:
<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:
它就是一个迭代器
并且不建议使用迭代器方法从其容器中删除项目。您应该为循环生成一个列表。
在您的第一个删除操作(使用迭代器)中,它实际上删除了所有奇数子元素(索引 0、2、4、..)并将所有偶数子元素留在您的根元素中。 您可以使用一个简单的列表尝试该行为:
l = [1,2,3,4,5,6]
for x in l:
l.remove(x)
print (l)
输出
[2, 4, 6]
您可以通过添加 <sub3>
元素在您的 XML 中尝试,并观察类似的结果。
根据此处的 official changelog,getchildren
方法已被弃用。
建议使用:
for child in list(root):
# do something