2008-09-29 2 views
1

이 XML 파일에는 작년 한 해 동안 보관 된 뉴스 기사가 포함되어 있습니다. 스토리 카테고리별로 이러한 스토리를 새로운 XML 파일로 정렬하라는 요청을 받았습니다.나는 100 MB XML 파일 (sans-DTD/Schema)을 가지고있다. XSLT는 그것을 가지지 않습니다. 변형/분석을위한 전략?

big_story_export.xml 

등등

lifestyles.xml 
food.xml 
nascar.xml 

로 변신 ... 그리고.

내가 일회성 파이썬 스크립트, 그러나를 사용하여 일을 가지고, 나는 원래이 사용 XSLT을 시도했다. 내 XPATH 선택이 침대를 골라 먹으면서 좌절감을 느끼게되었습니다. 테스트 파일은 완벽하게 변형되었지만 큰 파일을 내 스타일 시트에 붙여 넣으면 결과는 ... nothing.

이와 같은 파일이 XSLT를 통과하도록하려면 어떤 전략을 권장합니까? 이것은 벤더에 의해 나에게 건네졌다. 그래서이 파일의 구조를 정의 할 때 많은 영향력이 없다고 상상해 보라.

여러분이 코드 샘플을 원한다면, 함께 사용하겠습니다.

XML + XSLT가 원활하게 작동하도록하기위한 몇 가지 팁에 만족합니다.


내가 이것을 처리하기 위해 파이썬의 libxml2를 & libxslt를 사용하던

@Sklivvz

. 지금 xsltproc을 조사하고 있습니다.

이러한 일회성 상황에서는 좋은 도구 인 것 같습니다. 감사! diomidis-spinellis (언급 한 바와 같이) 내가 능력이없는하지만 그것은 잘 형성되어있어

그것이 유효성의 발견 @


.

스키마 작성과 관련하여 저는이 아이디어를 좋아합니다.

이 파일을 검증하는 데 드는 시간은 일회성 인 경우 실용적이지 않지만 필자의 공급 업체로부터 더 많은 파일을 처리해야 할 것으로 예상됩니다.

스키마를 작성하고 (공급 업체에 제출하는 것) XML 펑크를 관리하기위한 훌륭한 장기 전략이 될 것입니다. 감사!

답변

3

이 큰 XML 파일의 버그 또는 XSLT 프로세서 같은 소리 사용해보십시오. 파일에서 확인해야 할 두 가지 사항이 있습니다.

  1. 파일이 올바른 형식의 XML입니까? 즉, 모든 태그와 속성이 제대로 종료되고 일치합니까? xmlstarlet과 같은 XML 프로세서가이를 알려줍니다.
  2. 파일에 유효한 XML이 포함되어 있습니까? 이를 위해서는 스키마와 XML 유효성 검사기가 필요합니다 (xmlstarlet도이 트릭을 수행 할 수 있습니다). 파일의 스키마 정의를 작성하려는 노력을 투자하는 것이 좋습니다. 디버깅을 단순화 할 수 있습니다. 문제의 정확한 원인을 쉽게 찾아 낼 수 있기 때문에 디버깅이 간단 해집니다.

파일 형식이 올바르지 만 유효하지만 XSLT 프로세서가 예상 한 결과를 제공하기를 거부하는 경우 프로세서에 문제가 있다는 것을 확신 할 수 있으며 다른 하나를 시도해야합니다 .

2

사용하신 언어/파서는 무엇입니까?
큰 파일의 경우 Unix 명령 행 도구를 사용하려고합니다.
이들은 대개 다른 솔루션보다 훨씬 효율적이며 대용량 파일에서 "쓰레기"되지 않습니다.

xsltproc

+0

xsltproc에 대한 권장 사항은 두 번째입니다. 파이썬 XSLT가 그것을 처리하지 않기 때문에 시도해 볼 가치가있다. – DGentry

2

Saxon XSLT 프로세서를 권장 할 수 있습니까? Java JVM에 충분한 메모리를 제공한다면 큰 파일을 처리 할 수 ​​있다는 사실을 알고 있습니다.

다른 점은 XSLT의 도움이 될 수있는 최적화가있을 수 있지만 그러한 일에 대해 포괄적 인 설명을하기가 어렵다는 것입니다.

6

XSLT를 사용하여 임의로 큰 XML 문서를 처리 할 때의 문제점은 입력 문서를 소스 트리로 구문 분석하여 XSLT 처리를 시작한다는 것입니다. 이 트리는 메모리로 파싱됩니다. 즉, Saxon과 같은 견고한 XSLT 프로세서를 사용하고 가상 메모리가 풍부하더라도 문제가 발생할만한 입력 문서가 있습니다. (여전히 작동 할 수도 있지만 느려질 수 있습니다.)

XSLT를 사용하지 않는 또 다른 이유는 사용자가 지금까지 말한 내용에 기반하여 여러 출력 문서를 생성한다는 것입니다. 입력 문서를 여러 번 통과하는 것.

XSLT를 사용하는 대신 SAX 기반 접근 방식을 사용하는 것이 더 좋을 수도 있습니다. SAX 프로세서를 사용하면 원본 문서를 전달하는 단일 전달 방법을 작성하여 구문 분석하고 출력 문서를 포함하는 요소를 만날 때 모든 출력 문서를 작성하는 메서드를 작성할 수 있습니다.

0

아파치의 Xalan C++을 확인하십시오. 제 경험상, 다른 사람들 (Saxon 포함)이 "큰"XML 파일 (> 600 MB)에서 실패한 곳에서는 메모리로 여유있게 실행할 수있었습니다.

관련 문제