XML删除没有属性或子节点的节点

时间:2016-07-20 17:26:57

标签: python xml python-3.x elementtree xml.etree

我加载了一个xml文件,我想从中删除没有属性或子元素的元素,我正在尝试实现这样的目标:

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

但我想问题是我找到了元素,然后尝试将其从根元素中删除。有人可以告诉我怎么做吗?

1 个答案:

答案 0 :(得分:1)

您需要从父节点中删除节点,而不是从根节点删除节点。

以下代码适用于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)