为什么我无法从xml.etree.ElementTree.Element中删除子元素?

时间:2015-04-02 01:18:42

标签: python xml elementtree

我不明白发生了什么事? 我有 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错误。

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

etree.iter('tag1')返回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获取<tag1>中的第一个Element etree

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。)


如果<tag1>中可以有多个Element elt,那么您可以使用

for elt in etree_collection.values():
    for tag1 in elt.iter('tag1'):
        elt.remove(tag1)