2013-10-17 114 views
2

如何刪除當前節點,同時通過從根getiterator()函數遍歷所有節點?如何刪除python中的迭代器中的節點xml.etree.ElemenTree

import xml.etree.ElementTree as ET 
tree = ET.parse('file.xml') 
root = tree.getroot() 

for node in root.getiterator(): 
    #if some condition: 
     #remove(node) 
+0

對不起,這不是故意的。而這正是我的問題的解決方案,非常感謝 –

+0

NP,很高興我問,但! :-) –

回答

4

你不能在不知道父刪除節點,但xml.etree包不給你任何的方式來給定節點訪問父。

解決這個問題的唯一辦法是不是匹配的父節點:

for node in root.getiterator(): 
    if some_condition_matches_parent: 
     for child in node.getiterator(): 
      if some_condition_matches_child: 
       node.remove(child) 

如果切換到lxml庫(實現相同的API,但有更多的增強功能),你可以檢索父來自任何給定節點的節點:

node.getparent().remove(node) 
+1

我在將一個節點添加到另一個etree根節點後刪除了一個小問題,因爲添加節點會添加對該節點的引用並且不會創建新節點。我最終使用copy.deepcopy獲取節點的副本,然後再刪除它,以便將其添加到另一個樹中。希望能幫助別人。 :) – Spartacus