如何使用Python中的ElementTree通过搜索元素的属性来删除xml中的节点?

2024-10-03 00:26:19 发布

您现在位置:Python中文网/ 问答频道 /正文

示例xml文件:

<root>
   <child1 />
   <child2 bksetname="Default Backup Set" />
   <child3 bksetname="Local Backup Set" />
</root>

代码:

^{pr2}$

输出:

Entering elem:
self._children.remove(element)
child2
ValueError: list.remove(x): x not in list

我试图通过搜索文件中的元素来删除元素,如果它具有我想要的属性,我在代码中尝试了这种方法,结果在我的输出中出现了共享错误。 请告诉我如何使用xml.etree.ElementTree包裹。在


Tags: 文件代码default元素示例rootxmlbackup
2条回答

为此,您需要访问项目的父级。如果您确定它曾经有一层深,您可以使用以下方法直接将其移除:

tr.remove(item)

但如果不是,则需要创建一个反向树来访问父级,如describe Here,或者可以使用更强大的库,如lxml。在

然后可以使用xpathgetparent来处理这个问题。在

处理此查询的正确方法是使用XPATH:

^{pr2}$

模式//*[@bksetname="Default Backup Set"]表示具有bksetname=“Default Backup Set”属性的所有元素。然后我们请求它的父元素并移除元素。在

请注意我使用的是lxml而不是ElementTree。

您可以使用Free OnlineXpath tester检查XPATH

你必须把它从你正在迭代的元素中移除。这里的tr是一个ElementTree类型的对象。如果要从树中删除某个元素,可以从根元素中删除它。像这样:

import xml.etree.ElementTree as ET

tr = ET.parse("Scheduler.xml")
for elem in tr.iter():
    print elem.tag , elem.attrib
    if elem.attrib.get('bksetname') == "Default Backup Set":
        tr.getroot().remove(elem)

# for rewriting the file:
tr.write("Scheduler.xml")

相关问题 更多 >