2014-01-05 3 views
0

요소 트리에서 반복하는 동안 요소를 어떻게 바꿀 수 있습니까? 나는 markdown을위한 treeprocessor를 작성 중이며 요소를 감싸고 싶습니다. 내가 요소를 찾기 위해 getiterator('pre')를 사용트리에서 요소를 바꾸는 방법은 무엇입니까? (elementtree/markdown)

<div class='wrapper'><pre class='inner'>...</pre></div> 

<pre class='inner'>...</pre> 

이 될 경우,하지만 난 그것을 포장하는 방법을 모르겠어요. 문제 점은 발견 된 요소를 새 래퍼로 바꾸는 것이지만 기존 요소를 자식으로 유지하는 것입니다.

답변

2

이것은 약간 까다 롭습니다. 먼저 this previous question에 설명 된대로 부모 요소를 가져와야합니다.

parent_map = dict((c, p) for p in tree.getiterator() for c in p) 

당신이 인하가 lxml를 사용하여 얻을 수있는 경우

이 조금 더 쉽습니다 - 나는 lxml 요소가 이미 자신의 부모를 알고 있다고 생각합니다. 이제

, 당신이 반복하는에서 요소를 얻을 때, 당신은 또한 부모 얻을 수 있습니다 : 나는리스트로 나무에서 반복자를 설정 한

for elem in list(tree.getiterator('pre')): 
    parent = parent_map[elem] 
    wrap_elem(parent, elem) 

주 - 우리는하지 않으려을 트리를 수정하면서 트리를 수정하십시오. 그것은 문제 일 수 있습니다.

마지막으로, 당신은 주위의 요소를 이동하는 위치에있어 : ​​

def wrap_elem(parent, elem) 
    parent_index = list(parent).index(elem) 
    parent.remove(elem) 
    new_elem = ET.Element('div', attrib={'class': 'wrapper'}) 
    parent.insert(parent_index, new_elem) 
    new_elem.append(elem) 

가 * 내가 정확하게 ... 당신이 어떤 버그를 발견하면 알려 주시기이 코드를 테스트하지 않습니다. 내 경험에

+0

정상적으로 작동하는 것 같습니다. 대신에 이중 반복을 수행하는 변형을 시도했지만 모든 부모를 반복하고 자식의 내부 루프를 반복합니다. 나는 두 번째/나중의 패스가 모든 부모를 설정하지 않았을 수 있기를 원하지 않았다. –

0

, 당신은 당신이 원하는 것을 얻을 수 아래의 방법을 사용할 수 있습니다 :
xml.etree.ElementTree.SubElement (난 그냥 ET.Subelement를 호출합니다) http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement 여기

는 단계이다 : 당신의 반복하기 전에
, 당신이 얻을해야 이 반복 요소의 부모 요소를 먼저 변수 parent에 저장하십시오.

div = ET.SubElement(parent, 'div') 

div의 ATTRIB 설정 :이어서

, 1
는 가변 temp

2로 소자 <pre class='inner'>...</pre> 보관 parent에 새로운 하위 요소 div 추가

div.set('class','wrapper') 

3 단계에서 요소를 추가하십시오. div의 하위 요소로 P 1,

ET.SubElement(div, temp) 

4, 1 단계에서 요소를 삭제 :

parent.remove(temp) 
0

의를 리핑과 유사한 나를 위해 작동 다른 솔루션을. 요소를 임시로 복사하십시오. 원하는 외부 태그로 원본 요소를 다시 태그 지정하고 지우고 원본을 복사하십시오.

import copy 

temp = copy.deepcopy(elem) 
elem.tag = "div" 
elem.set("class","wrapper") 
elem.clear() 
elem.append(temp) 
관련 문제