您需要從其父,而不是從根中刪除節點。
下面的代碼適用於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)
對不起,我在想什麼? AttributeError:'xml.etree.ElementTree.Element'對象沒有屬性'getparent' – mao
'getparent()'在lxml中可用,但不在標準庫ElementTree模塊中。 – mzjn
@mao我明白了。試試'child.findall('..')[0] .remove(child)'。 – Tomalak