2015-04-02 132 views
0

我不明白是怎么回事? 我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错误。

这里有什么问题?

回答

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 in etree

In [177]: etree.find('tag1') 
Out[177]: <Element tag1 at 0x7f4373698ef0> 

因此,使用find你可能会使用这样的:(我改变etreeelt因为etree让我想起了太多的模块xml.etree的)

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


如果可以有多个<tag1>Elementelt,那么你可以使用

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

嗯,由于某些原因完全相同的代码不适用于我。 – minerals 2015-04-02 01:39:54

+0

你会得到什么回溯错误信息? – unutbu 2015-04-02 01:41:03

+0

对不起,它现在有效。 – minerals 2015-04-02 01:46:45

相关问题