2013-10-17 5 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 패키지는 당신에게 주어진 노드에서 부모에 액세스 할 수있는 방법을 제공하지 않습니다.

이 주변에있는 유일한 방법은 대신 부모 노드와 일치한다 : 당신이 (그러나 추가 개선과 같은 API를 구현)에 lxml 라이브러리로 전환하면

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

, 당신은 부모를 검색 할 수 있습니다 주어진 노드의 노드 :

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

노드를 추가하면 다른 노드에 노드를 추가하고 새로운 노드를 만들지 않으므로 다른 etree 루트에 노드를 추가 한 후 제거하는 데 약간의 문제가 있습니다. 나는 그것을 제거하기 전에 copy.deepcopy를 사용하여 노드의 사본을 얻었으므로 다른 트리에 추가 할 수있었습니다. 희망은 누군가를 돕습니다. :) – Spartacus

관련 문제