Python xml.etree.ElementTree.Element.remove不删除所有元素
请参阅以下代码:Python xml.etree.ElementTree.Element.remove不删除所有元素,python,xml,elementtree,Python,Xml,Elementtree,请参阅以下代码: 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
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))
将xml.etree.ElementTree作为ET导入
对于(“,”,“)中的x:
root=ET.fromstring(x)
对于根目录中的e:root.remove(e)
打印(ET.tostring(根))
我希望它在所有情况下都能输出
,但它会给出:
b'<a><c><d /></c></a>'
b'<a><b /></a>'
b'<a><q /><c><d /></c></a>'
b''
b“
b“
我完全不喜欢这个。我也没有看到被删除的特定元素的任何模式
文件只说:
从元素中删除子元素。与find*方法不同,此方法
方法基于实例标识而不是标记来比较元素
价值或内容
我做错了什么?我在Kubuntu Trusty上获得的Python 2.7.5和3.4.0的输出基本相同
谢谢 是,获取根标记的所有子项,并按相反顺序逐个删除 例如 [1]中的
:将xml.etree.ElementTree作为ET导入
在[2]:content=“”
在[15]中:root=ET.fromstring(content)
在[16]中:对于root.getchildren()中的e[::-1]:
..:打印e
..:根。删除(e)
....:
In[17]:ET.tostring(根)
出[17]:“
在编写代码时,只删除一个元素。 例如 [21]中的
:root=ET.fromstring(content)
In[22]:对于根中的e:
..:打印“元素:”,e
..:根。删除(e)
....:
要素:
In[23]:ET.tostring(根)
出[23]:“
不可逆
In [45]: root = ET.fromstring(content)
In [46]: for e in root.getchildren():
....: print "Elenment:", e
....: root.remove(e)
....:
Elenment: <Element 'b' at 0xb6219dcc>
In [47]: ET.tostring(root)
Out[47]: '<a>asas<c><d /></c></a>'
[45]中的:root=ET.fromstring(content)
在[46]中:对于root.getchildren()中的e:
..:打印“元素:”,e
..:根。删除(e)
....:
元素:
In[47]:ET.tostring(根)
Out[47]:“asas”
是,获取根标记的所有子项,并按相反顺序逐个删除
例如
[1]中的:将xml.etree.ElementTree作为ET导入
在[2]:content=“”
在[15]中:root=ET.fromstring(content)
在[16]中:对于root.getchildren()中的e[::-1]:
..:打印e
..:根。删除(e)
....:
In[17]:ET.tostring(根)
出[17]:“
在编写代码时,只删除一个元素。 例如 [21]中的
:root=ET.fromstring(content)
In[22]:对于根中的e:
..:打印“元素:”,e
..:根。删除(e)
....:
要素:
In[23]:ET.tostring(根)
出[23]:“
不可逆
In [45]: root = ET.fromstring(content)
In [46]: for e in root.getchildren():
....: print "Elenment:", e
....: root.remove(e)
....:
Elenment: <Element 'b' at 0xb6219dcc>
In [47]: ET.tostring(root)
Out[47]: '<a>asas<c><d /></c></a>'
[45]中的:root=ET.fromstring(content)
在[46]中:对于root.getchildren()中的e:
..:打印“元素:”,e
..:根。删除(e)
....:
元素:
In[47]:ET.tostring(根)
Out[47]:“asas”
这说明了问题:
>>> 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>
作为一种解决方法,您可以重复删除第一个子元素,如下所示:
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)
这说明了问题:
>>> 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>
作为一种解决方法,您可以重复删除第一个子元素,如下所示:
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)
@维维克塞布尔:谢谢你的投票
clear()
可以,只要可以丢失父元素的所有属性。(,“”,“”)
在Python 2.7
中无效,获得语法错误:无效语法
异常。这在python3+
?@VivekSable中有效:再次感谢您指出输入错误:)。。。修正。欢迎,我正在学习Python,请检查您的答案,并尝试澄清我的概念和答案。@mhawke谢谢您的回复。显然,我没有使用clear()
来避免重置所有属性。@VivekSable:谢谢你的投票clear()
可以,只要可以丢失父元素的所有属性。(,“”,“”)
在Python 2.7
中无效,获得语法错误:无效语法
异常。这在python3+
?@VivekSable中有效:再次感谢您指出输入错误:)。。。修正。欢迎,我正在学习Python,请检查您的答案,并尝试澄清我的概念和答案。@mhawke谢谢您的回复。显然,我没有使用clear()
来避免重置所有属性。谢谢,但是没有必要按相反的顺序进行。只需在root.getchildren():root.remove(e)中对e执行,就足够了。@jamadagni:没有反向操作对我不起作用。更新的答案,请检查并让我知道它是如何为您工作的。奇怪的是,它在Py3中工作,而不是在Py2中,您似乎正在使用。刚刚在我的Kubuntu Trusty系统上的Py 2.7.6和3.4.0上进行了验证。试试Py3,看看它是如何为您工作的。(注意:如果您还不知道,您必须使用print
作为一个函数。)谢谢,但无需按相反顺序操作。只需在root.getchildren():root.remove(e)
中对e执行,就足够了。@jamadagni:没有反向操作对我不起作用。更新的答案,请检查并让我知道它是如何为您工作的。奇怪的是,它在Py3中工作,而不是在Py2中,您似乎正在使用。刚刚在我的Kubuntu Trusty系统上的Py 2.7.6和3.4.0上进行了验证。试试Py3,看看它是如何为您工作的。(注意:如果您还不知道,您必须使用print
作为一个函数。)
b'<a />'
b'<a />'
b'<a />'
>>> root = ET.fromstring('<a href="blah"><b /><c><d /></c></a>')
>>> root.clear()
>>> ET.tostring(root)
b'<a />'