2015-04-02 55 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

相關問題