如何使用一个循环删除多个XML元素?

问题描述 投票:0回答:1

我在文件中有一些XML数据。我的代码读取了它,因此我想从代码中删除不需要的元素,然后再在代码中稍后使用数据。我有一个不需要的名称列表,我需要删除属性name不需要的特定层次结构位置上的所有节点。

我使用循环for child_element in parent_element:,并在循环内删除所有符合条件的子元素:parent_element.remove(child_element)。问题是,当删除任何子元素时,它会使迭代混乱,跳过对下一个子元素的检查。

为了解决这个问题,我添加了一个难看的补丁-我一次又一次地运行删除循环,直到发现没有要删除的内容为止。

import xml.etree.ElementTree as ET
...

names_to_delete = ['bad1', 'bad2']
tree = ET.parse(...)
parent_element = tree.getroot()[0][0]
try_delete_name = True
while try_delete_name: # try deleting again and again, until nothing to delete
    try_delete_name = False
    for child_element in parent_element:
        assert 'name' in child_element.attrib
        if child_element.attrib['name'] in names_to_delete:
            parent_element.remove(child_element)
            try_delete_name = True

示例XML数据:

<root>
    <whatever>
        <parent>
            <child name="x">
                <value>99</value>
            </param>
            <child name="bad2">
                <value>222</value>
            </param>
            <child name="y">
                <value>88</value>
            </param>
            <child name="bad1">
                <value>666</value>
            </param>
        </parent>
    </whatever>
</root>

我如何仅使用一次遍历子元素来实现这一点?

python elementtree
1个回答
0
投票

这应该可以解决问题:

import xml.etree.ElementTree as ET

names_to_delete = ['bad1', 'bad2']
tree = ET.parse("example.xml")
parent_element = tree.getroot()[0][0]

for child in list(parent_element):
    if child.attrib["name"] in names_to_delete:
        parent_element.remove(child)

list(parent_elment)返回孩子。

© www.soinside.com 2019 - 2024. All rights reserved.