为什么我不能从 xml.etree.ElementTree.Element 中删除子元素?
Why I can't remove a subelement from xml.etree.ElementTree.Element?
我不明白这是怎么回事?
我有 xml.etree.ElementTree.Element 个具有以下表示的对象:
<root>
<tag1>some text</tag1>
<l1>text</l1>
<l2>text</l2>
</root>
我想删除 <tag1>...</tag1>
子元素。 etree_collection 是一个包含 ElementTree.Element 个对象的 OrderedDict。
for etree in etree_collection.values():
tag1 = etree.iter('tag1')
etree.remove(tag1)
此代码产生 ValueError: list.remove(x): x not in list
错误。
这里有什么问题?
etree.iter('tag1')
returns一个ElementDepthFirstIterator
:
In [175]: etree.iter('tag1')
Out[175]: <lxml.etree.ElementDepthFirstIterator at 0x7f43736a61e0>
您必须遍历迭代器中的项目才能获得 <tag1>
Elements
:
In [176]: list(etree.iter('tag1'))
Out[176]: [<Element tag1 at 0x7f4373698ef0>]
相反,您可以使用 find
获取 etree
中的第一个 <tag1>
Element
:
In [177]: etree.find('tag1')
Out[177]: <Element tag1 at 0x7f4373698ef0>
所以使用 find
你可能会使用类似的东西:
for elt in etree_collection.values():
tag1 = elt.find('tag1')
elt.remove(tag1)
(我将 etree
更改为 elt
,因为 etree
让我想起了太多模块 xml.etree
。)
如果elt
中可以有多个<tag1>
Element
,那么你可以使用
for elt in etree_collection.values():
for tag1 in elt.iter('tag1'):
elt.remove(tag1)
我不明白这是怎么回事? 我有 xml.etree.ElementTree.Element 个具有以下表示的对象:
<root>
<tag1>some text</tag1>
<l1>text</l1>
<l2>text</l2>
</root>
我想删除 <tag1>...</tag1>
子元素。 etree_collection 是一个包含 ElementTree.Element 个对象的 OrderedDict。
for etree in etree_collection.values():
tag1 = etree.iter('tag1')
etree.remove(tag1)
此代码产生 ValueError: list.remove(x): x not in list
错误。
这里有什么问题?
etree.iter('tag1')
returns一个ElementDepthFirstIterator
:
In [175]: etree.iter('tag1')
Out[175]: <lxml.etree.ElementDepthFirstIterator at 0x7f43736a61e0>
您必须遍历迭代器中的项目才能获得 <tag1>
Elements
:
In [176]: list(etree.iter('tag1'))
Out[176]: [<Element tag1 at 0x7f4373698ef0>]
相反,您可以使用 find
获取 etree
中的第一个 <tag1>
Element
:
In [177]: etree.find('tag1')
Out[177]: <Element tag1 at 0x7f4373698ef0>
所以使用 find
你可能会使用类似的东西:
for elt in etree_collection.values():
tag1 = elt.find('tag1')
elt.remove(tag1)
(我将 etree
更改为 elt
,因为 etree
让我想起了太多模块 xml.etree
。)
如果elt
中可以有多个<tag1>
Element
,那么你可以使用
for elt in etree_collection.values():
for tag1 in elt.iter('tag1'):
elt.remove(tag1)