簡體   English   中英

使用 python 中的 ElementTree 刪除特定的 xml 標記

[英]Remove a specific xml tag with ElementTree in python

我正在尋找一種方法來刪除在xml文件中具有mmm值的特定標簽<e> (即<e>mmm</e> 。我指的是這個線程作為凝視指南: How to remove elements from XML using Python不使用lxml庫而不是使用ElementTreepython v2.6.6 。我試圖用線程連接一個點並閱讀ElementTree api ,但我沒有成功。

感謝您對此的建議和想法。

<?xml version='1.0' encoding='UTF-8'?>
<parent>
   <first>
     <a>123</a>                              
     <c>987</c>
       <d>
         <e>mmm</e>
         <e>yyy</e>           
       </d>         
   </first>
   <second>
     <a>456</a>                      
     <c>345</c>
       <d>
         <e>mmm</e>
         <e>hhh</e>            
       </d>
   </second>
 </parent>

我花了一段時間才意識到所有<e>標簽都是<d>的子節點。

如果我們可以假設上述所有目標節點(具有值mmm<e>節點)都是正確的,則可以使用此腳本。 (我添加了一些額外的節點來檢查它是否有效

import xml.etree.ElementTree as ET

xml_string = """<?xml version='1.0' encoding='UTF-8'?>
<parent>
   <first>
     <a>123</a>                              
     <c>987</c>
       <d>
         <e>mmm</e>
         <e>aaa</e>
         <e>mmm</e>
         <e>yyy</e>           
       </d>         
   </first>
   <second>
     <a>456</a>                      
     <c>345</c>
       <d>
         <e>mmm</e>
         <e>hhh</e>            
       </d>
   </second>
 </parent>"""

# this is how I create my root, if you choose to do it in a different way the end of this script might not be useful
root = ET.fromstring(xml_string)

target_node_first_parent = 'd'
target_node = 'e'
target_text = 'mmm'

# find all <d> nodes
for node in root.iter(target_node_first_parent):
    # find <e> subnodes of <d>
    for subnode in node.iter(target_node):
        if subnode.text == target_text:
            node.remove(subnode)

# output the result         
tree = ET.ElementTree(root)
tree.write('output.xml')

我試圖只刪除root.iter(yourtag)找到的節點,但顯然不可能從根目錄中刪除(顯然這並不容易

讓我知道這是否對您有所幫助,我對 XML 不太了解,如果我扼殺了任何術語,我會很高興聽到和學習!

@Queuebee 的答案完全正確,但如果您想從文件中讀取,下面的代碼提供了一種方法。

import xml.etree.ElementTree as ET

file_loc = " "
xml_tree_obj = ET.parse(file_loc)

xml_roots = xml_tree_obj.getroot()

target_node_first_parent = 'd'
target_node = 'e'
target_text = 'mmm'

# find all <d> nodes
for node in xml_roots.iter(target_node_first_parent):
    # find <e> subnodes of <d>
    for subnode in node.iter(target_node):
        if subnode.text == target_text:
            node.remove(subnode)

out_tree = ET.ElementTree(xml_roots)
out_tree.write('output.xml')

暫無
暫無

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

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