2010-03-05 6 views
2

거대한 XML 파일이 있습니다. 그러나 나는이 거대한 나무의 작은 하위 트리에만 관심이있다. 이 하위 트리를 구문 분석하고 싶지만 작은 부분 만 사용하려고 할 때 전체 대규모 트리를 파싱하는 데 시간을 낭비하고 싶지 않습니다.은 XML 파일의 특정 하위 트리 만 구문 분석합니다.

이상적으로,이 하위 트리의 시작 부분을 찾을 때까지 파일을 스캔하고 끝에 도달 할 때까지 하위 트리를 구문 분석 한 다음 파일의 나머지 부분을 읽지 않아도됩니다. 어쩌면 XPath 표현식에 관심이있는 하위 트리를 설명 할 수도 있습니다. lxml을 사용하여이를 수행 할 수 있습니까? iterparse() 메서드를 사용하여 이와 같은 작업을 수행 할 수있는 것처럼 보이지만 문서를 기반으로하면 사용하려는 구문 분석 된 객체가 생성되지 않은 것처럼 보입니다. 어떤 제안?

은 (LXML를 사용하는 것은 필요하지 않습니다,하지만 난 파이썬을 사용하려면, 이상적으로 나는 빠른 수를 싶습니다.)

답변

1

나는 iterparse 당신이 원하는 인상을 얻을. XPath는 또한 일할 수있는하지만 난 반면 반환하기 전에 XPath는 전체 트리에 읽고 추측 것 같은

context = etree.iterparse(xmlfile, tag="yourSubTree") 
action, elem = context.next() 
etree.iterwalk(elem, ...)... 

이 보인다 : 그건 당신을 제공합니다 같은 http://lxml.de/parsing.html에 대해서는 "선택적 태그 이벤트"를 보면 당신이 원하는 무엇을 보인다 iterparse가 일치 할 때까지 트리를 걷기를 기대합니다. 두 가지 접근법을 프로파일 링하는 것이 가치가있을 것입니다.

0

Iterparse는 원하는 모든 하위 트리까지 구문 분석해야합니다. 하위 트리를 파서에 정규식으로 제공하기 전에 하위 트리를 추출하는 것이 더 효율적일 수 있습니다. 색소 파서를 쓰고 싶을 수도 있습니다. 삭스는 아마 lxml보다 느릴 지 모르지만 메모리를 많이 사용하지 않으므로 어떤 경우에는 더 좋을 수도 있습니다.

관련 문제