2011-07-07 3 views
0

일부 XML 파일로 작업하고 있습니다. 파일의 스키마는 특정 유형의 요소 중 하나만있을 수 있음을 지정합니다 (이 경우에는 각주 요소로 작업하고 있습니다).목록에서 특정 유형의 유일한 요소를 어떻게 처리하고 있습니까?

각주 요소에 여러 각주 요소가있을 수 있으므로 각주 요소를 파악하고 처리하기 위해 각주 요소를 가져 와서 처리하려고합니다. 여기

는 element_list이 얻을 수있는 더 파이썬 방법이 있는지

그래서 내가 궁금 전체 트리를 반복 한 후 나에게 관련된 요소의 목록입니다

def get_footnotes(element_list): 
    footnoteDict=od() 

    footnotes_element=[item for item in element_list if item.tag=='footnotes'][0] 
    for eachFootnote in footnotes_element.iter(): 
     if eachFootnote.tag=='footnote': 
      footnoteDict[eachFootnote.values()[0]]=eachFootnote.text 
    return footnoteDict 

나의 현재의 접근 방식 대신 요소 목록을 통해 반복의 각주 요소는이 생 같은

footnotes_element=[item for item in element_list if item.tag=='footnotes'][0] 
+0

:

이 질문은 아주 좋은 예를 갖고있는 것 같아요 in-python). 아마도 XPath와 lxml을 사용해야 할 것입니다. – buruzaemon

+0

@erkysun 도움이된다 – PyNEwbie

답변

2

뭔가 되 고 서투른 나에게 보인다 작업을해야합니다 :

from lxml import etree 

xmltree = etree.fromstring(your_xml) 

for footnote in xmltree.iterfind("//footnotes/footnote"): 
    # do something 
    pass 

샘플 XML을 제공하면 도움이됩니다.

편집 : 당신은 정말 큰 파일로 작업하는 경우

, 당신이 iterparse에보고 할 수 있습니다. 당신은이 질문을보고 그 대답 (http://stackoverflow.com/questions/8692/how-to-use-xpath-을 가져야한다 python's lxml and iterparse method

+0

트리에서 관련 요소를 가져 오는 대신 전체 트리를 전달하는 것이 좋습니다. 이것은 흥미로운 제안이고 그것에 대해 약간 생각할 필요가 있습니다. 나는 element_list에 관심이있는 요소의 부모를 끌어 와서 그 목록을 다른 함수로 전달하는 함수를 먼저 실행하고있다. 당신의 제안은 단지 나무를 가져다가 전달하는 것입니다. 내 생각으로는 내가 작업중인 나무 중 일부가 대량으로 크기 때문에 내가 필요로하는 다른 물건의 쓰레기 수거를 통해 제거하고있는 기능에서 원하는 요소를 뜯어 냄으로써 – PyNEwbie

+0

정말 큰 작업을한다면 'iterparse' 파일을 살펴 봐야합니다. 전체 파일을 먼저 구문 분석하고이를 메모리에 보관하는 대신 파일이 파싱 될 때 데이터를 추출 할 수 있습니다. – Acorn

+0

@PyNEwbie, "전체 트리"를 지나치지 않고 그냥 참조 만하면됩니다. –

관련 문제