2011-09-07 4 views
5

나는 XML 파일을 구문 분석하기위한 파이썬 코드가 detailed here입니다. XML 파일은 메모리에서 조작 될 때 시스템 리소스를 소모하는 것으로 악명이 높습니다. 내 솔루션은 작은 XML 파일 (예 : 200KB, 340MB 파일)에서 작동합니다.XML 파일을 파이썬에서 간단한 방법으로 분할하는 방법은 무엇입니까?

StAX (끌어 오기 구문 분석기) 구현을 연구하기 시작했지만 긴밀한 일정으로 실행 중이며이 작업에 대한 훨씬 간단한 방법을 찾고 있습니다.

작은 크기의 파일을 만드는 것을 이해하지만 매번 주/헤더 태그를 출력하여 올바른 요소를 추출하는 방법은 무엇입니까?

<?xml version="1.0" ?> 
<!--Sample XML Document--> 
<bookstore> 
    <book Id="1"> 
     .... 
     .... 
    </book> 
    <book Id="2"> 
     .... 
     .... 
    </book> 
    <book Id="3"> 
     .... 
     .... 
    </book> 
    .... 
    .... 
    .... 
    <book Id="n"> 
     .... 
     .... 
    </book> 
</bookstore> 

가 어떻게 모든 1000 개 책 요소에 대한 헤더 데이터와 새로운 XML 파일을 만들려면 어떻게해야합니까 : 예를 들어

,이 스키마인가? 코드와 데이터 세트의 구체적인 예는 내 다른 question here을 참조하십시오. 고마워.

내가 원하는 것은 데이터 세트의 메모리 내로드를 모두 피하는 것입니다. 스트리밍 방식으로 XML 파일을 구문 분석 할 수 있습니까? 내가 옳은 줄을 생각하고 있니?

p.s : 내 상황은 2009 년에 question asked과 비슷합니다. 내 문제에 대한 간단한 해결책을 찾으면 여기에 답변을 게시합니다. 귀하의 의견은 높이 평가됩니다.

답변

8

:

from xml.etree.cElementTree import iterparse 

# get an iterable and turn it into an iterator 
context = iter(iterparse("path/to/big.xml", events=("start", "end"))) 

# get the root element 
event, root = next(context) 
assert event == "start" 

for event, elem in context: 
    if event == "end" and elem.tag == "book": 
     # ... process book elements ... 
     root.clear() 
2

elementtree.iterparse을 사용하고 처리 된 각 책 태그를 폐기 할 수 있습니다. 당신은 parse your big XML file incrementally을 할 수

+1

성능 향상을위한 더 나은 아직, 사용 LXML의 etree (http://lxml.de/tutorial.html). – six8

+1

@Cixate : 구문 분석 만 필요할 때'cElementTree.iterparse()'가'lxml.etree.iterparse()'보다 느린 지 여부는 벤치 마크없이 (http://www.ibm.com/developerworks/xml) 명확하지 않다./library/x-hiperfparse / – jfs

관련 문제