2016-07-20 78 views
0

我有加載一個XML文件,從中我想刪除一些沒有屬性或子元素,我想實現這樣的事情:XML刪除節點沒有任何屬性或子女

for child in root.find('targetElement'): 
    print(child) 
    if(len(child.attrib) < 1 and len(child) < 1): 
     root.remove(child) 

但我想問題是我找到元素,然後試圖從根元素中刪除它。有人可以告訴我如何做到這一點?

回答

0

您需要從其父,而不是從根中刪除節點。

下面的代碼適用於lxml.etree

from lxml import etree as ET 

root = ET.parse('yourfile.xml') 

for child in root.iterfind('targetElement'): 
    if(len(child.attrib) < 1 and len(child) < 1): 
     child.getparent().remove(child) 

標準xml.etree.ElementTree缺乏選擇父節點的任何像樣的方法。我們可以通過構建整棵樹的子對父映射來解決此限制(source):

import xml.etree.ElementTree as ET 

root = ET.parse('yourfile.xml') 

# https://stackoverflow.com/a/20132342/18771 
parent_map = {c:p for p in root.iter() for c in p} 

for child in root.iterfind('targetElement'): 
    if(len(child.attrib) < 1 and len(child) < 1): 
     parent_map[child].remove(child) 
+0

對不起,我在想什麼? AttributeError:'xml.etree.ElementTree.Element'對象沒有屬性'getparent' – mao

+0

'getparent()'在lxml中可用,但不在標準庫ElementTree模塊中。 – mzjn

+0

@mao我明白了。試試'child.findall('..')[0] .remove(child)'。 – Tomalak