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

时间:2015-12-23 07:47:38

标签: python xml python-2.7

示例xml文件:

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

代码:

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":
        elem.remove(elem.tag)

输出:

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

我试图通过搜索文件中的元素来删除元素,如果它具有我想要的属性。我在我的代码中尝试了这种方式并在输出中获得错误作为共享。 请告诉我如何使用xml.etree.ElementTree包执行此操作。

2 个答案:

答案 0 :(得分:3)

您必须从正在迭代的元素中删除它。此处trElementTree类型对象。如果要从树中删除某些元素,可以通过从根元素中删除它来完成。像这样:

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")

答案 1 :(得分:1)

为此,您需要访问项目的父级。如果你确定它有一层深,你可以直接删除它:

tr.remove(item)

但如果没有,您需要创建一个反向树来访问父级,如描述Here,或者您可以使用更强大的库,如lxml

然后,您可以使用xpathgetparent来解决问题。

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

from lxml import etree
tr = etree.fromstring(open("Scheduler.xml").read())
for item in tr.xpath(//*[@bksetname="Default Backup Set"]):
    item.getparent().remove(item)

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

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

您可以使用Free OnlineXpath tester来检查XPATH