示例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包执行此操作。
答案 0 :(得分:3)
您必须从正在迭代的元素中删除它。此处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")
答案 1 :(得分:1)
为此,您需要访问项目的父级。如果你确定它有一层深,你可以直接删除它:
tr.remove(item)
但如果没有,您需要创建一个反向树来访问父级,如描述Here,或者您可以使用更强大的库,如lxml。
然后,您可以使用xpath
和getparent
来解决问题。
处理此查询的正确方法是使用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