gpt4 book ai didi

python - xml.etree.ElementTree.Element.remove 不删除所有元素

转载 作者:行者123 更新时间:2023-12-02 17:32:41 36 4
gpt4 key购买 nike

请看下面的代码:

import xml.etree.ElementTree as ET
for x in ("<a><b /><c><d /></c></a>", "<a><q /><b /><c><d /></c></a>", "<a><m /><q /><b /><c><d /></c></a>"):
root = ET.fromstring(x)
for e in root: root.remove(e)
print(ET.tostring(root))

我希望它输出 <a></a>在所有情况下,而是它给出:

b'<a><c><d /></c></a>'
b'<a><b /></a>'
b'<a><q /><c><d /></c></a>'

我完全不理解这个。我也没有看到已删除的特定元素有任何模式。

文档仅仅说:

Removes subelement from the element. Unlike the find* methods this method compares elements based on the instance identity, not on tag value or contents.

我在做什么/假设错了什么?我在 Kubuntu Trusty 上使用 Python 2.7.5 和 3.4.0 得到的输出基本相同。

谢谢!

最佳答案

这说明了问题:

>>> root = ET.fromstring("<a><b /><c><d /></c></a>")
>>> for e in root:
... print(e)
...
<Element 'b' at 0x7f76c6d6cd18>
<Element 'c' at 0x7f76c6d6cd68>
>>> for e in root:
... print(e)
... root.remove(e)
...
<Element 'b' at 0x7f76c6d6cd18>

因此,修改您正在迭代的对象会影响迭代。这并非完全出乎意料,如果您在遍历列表时更改列表也是一样的:

>>> l = [1, 2, 3, 4]
>>> for i in l:
... l.remove(i)
>>> print l
[2, 4]

作为解决方法,您可以像这样重复删除第一个子元素:

import xml.etree.ElementTree as ET
for x in ("<a><b /><c><d /></c></a>", "<a><q /><b /><c><d /></c></a>", "<a><m /><q /><b /><c><d /></c></a>"):
root = ET.fromstring(x)
for i in range(len(root)):
root.remove(root[0])
ET.tostring(root)

输出

b'<a />'
b'<a />'
b'<a />'

这是有效的,因为循环执行时迭代器没有变化。 或者,如果您想删除根元素 的所有子元素,您可以使用 root.clear():

>>> root = ET.fromstring('<a href="blah"><b /><c><d /></c></a>')
>>> root.clear()
>>> ET.tostring(root)
b'<a />'

关于python - xml.etree.ElementTree.Element.remove 不删除所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30859857/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com