从XML中删除父元素和所有子元素

时间:2014-09-23 23:07:26

标签: python xml python-2.7 elementtree

给定具有以下结构的XML文件:

<Root>
    <Stuff></Stuff>
    <MoreStuff></MoreStuff>
    <Targets>
        <Target>
            <ID>12345</ID>
            <Type>Ground</Type>
            <Size>Large</Size>
        </Target>
        <Target>
            ...
        </Target>
    </Targets>
</Root>

我试图遍历<Targets>元素下的每个子项,检查每个<ID>是否有特定值,如果找到该值,那么我想删除整个{ {1}}条目。我一直在使用ElementTree Python库,但收效甚微。这就是我到目前为止所拥有的:

<Target>

我采用这种方法的问题是只删除了import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() iterator = root.getiterator('Target') for item in iterator: old = item.find('ID') text = old.text if '12345' in text: item.remove(old) tree.write('out.xml') 子元素,但我需要移除整个<ID>元素及其所有子元素。谁能帮忙!感谢。

2 个答案:

答案 0 :(得分:7)

不幸的是,元素树元素不知道他们的父母是谁。有一种解决方法 - You can build the mapping yourself

tree = ET.parse('file.xml')
root = tree.getroot()
parent_map = dict((c, p) for p in tree.getiterator() for c in p)

# list so that we don't mess up the order of iteration when removing items.
iterator = list(root.getiterator('Target'))

for item in iterator:
    old = item.find('ID')
    text = old.text
    if '12345' in text:
        parent_map[item].remove(item)
        continue

tree.write('out.xml')

未测试

答案 1 :(得分:3)

您需要保留对Targets元素的引用,以便您可以删除其子元素,因此从那里开始迭代。抓住每个目标,检查你的情况并删除你不喜欢的东西。

#!/usr/bin/env python
import xml.etree.ElementTree as ET

xmlstr="""<Root>
    <Stuff></Stuff>
    <MoreStuff></MoreStuff>
    <Targets>
        <Target>
            <ID>12345</ID>
            <Type>Ground</Type>
            <Size>Large</Size>
        </Target>
        <Target>
            ...
        </Target>
    </Targets>
</Root>"""

root = ET.fromstring(xmlstr)

targets = root.find('Targets')

for target in targets.findall('Target'):
    _id = target.find('ID')
    if _id is not None and '12345' in _id.text:
        targets.remove(target)

print ET.tostring(root)
相关问题