0

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

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

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

4

1 回答 1

2

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

以下代码适用于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)
于 2016-07-20T17:31:29.360 回答