Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python xml.etree.ElementTree.Element.remove不删除所有元素_Python_Xml_Elementtree - Fatal编程技术网

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 />'