簡體   English   中英

如何通過搜索元素的屬性在Python中使用ElementTree刪除xml中的節點?

[英]How do I remove a node in xml using ElementTree in Python by searching attributes of an element?

樣本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包進行此操作。

您必須將其從要迭代的元素中刪除。 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")

為此,您需要訪問項目的父項。 如果您確定它深一層,可以使用以下方法直接將其刪除:

tr.remove(item)

但是,如果不是這樣,則需要創建一個反向樹來訪問父級,例如describe 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 =“默認備份集”的元素。 然后,我們要求它的父項並刪除該元素。

請提及我使用lxml代替ElementTree。

您可以使用免費的OnlineXpath測試器來檢查XPATH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM