为什么我不能从 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)