2011-08-06 4 views
1

(파이썬 3.2)etree에서 iterdescendants()를 사용할 때 트리를 수정해도 괜찮습니까?

XML을 구문 분석하기 위해 etree을 사용하고 있습니다. 이렇게하려면 iterdescendants()으로 반복적으로 문서를 반복합니다. 그래서, 다음과 같은 것 :

나중의 재귀에서 처리되지 않도록하려는 자식을 포함하는 부모 태그를 처리하는 경우가 있습니다. 아이들을 파멸시키는 것이 괜찮습니까? 내 초기 테스트에서

는, 나는 시도했다 : 어떤 이유

for child in elem.getchildren(): child.clear() 

이 즉시 처리되는 elem 후 요소가 발생합니다. 그것은 요소가 제거되는 것과 같습니다.

그때 (는 부모와 자식을 제거 점에서, 그러나뿐만 아니라 영향/생략되는 부모의 후속 형제 발생하지 않습니다) 어떤 작품이 시도 :

elem.clear() 

누구든지 이것에 대해 밝힐 수 있습니까? 감사,

+0

나는 행동이 정의되지 않았다고 생각합니다. –

답변

1

나는 당신 대신에 다음과 같은 코드를 가지고 있으며, 모든 하위 요소를 삭제, 작동하는 것 같습니다. iterfind를 사용하여 태그가있는 모든 자손을 찾아 삭제합니다.

for element in doc.iterfind('.//%s'%tag): 
    element.getparent().remove(element) 
+0

잘 작동합니다, 감사합니다! –

+0

환영합니다. 나는 기꺼이 도와 줄 것이다 –

+0

나는 또한 내가 왜 이것이 작동하는지 (그리고 나의 다른 접근은하지 않았다) 알아 냈다고 믿는다. iterparse와 iterwalk에 대한 설명에서, lxml에 대한 문서는'end' 이벤트 이후 반복되는 트리를 수정할 수 있다고 설명합니다. 이벤트는 iterparse 및 iterwalk에만 적용됩니다. 그러나 여기에서도 적용됩니다. 현재 요소를 반복하는 경우에는 요소를 건드리지 않아야합니다. 그러나 자식을 자유롭게 수정할 수 있습니다. –