2009-03-18 5 views
2

PHP에서 꽤 큰 XML (예 : 300MB)을 구문 분석해야합니다. 가장 효과적으로 어떻게 할 수 있습니까?PHP에서 큰 XML 구문 분석

특히 특정 태그를 찾아 평면 TXT 파일에서 콘텐츠를 추출해야합니다.

+0

XSL w/XMLStarlet을 생성 한 다음 Xalan/Xerces를 적용하여 문제를 해결했습니다. 당신의 도움을 주셔서 감사합니다. –

답변

1

만약 내가 한 두 번 일한다면, XML Starlet을 쓰겠습니다. 그러나 만약 당신이 정말로 그것을 PHP 쪽에서하고 싶다면, 작은 조각으로 나누어서 처리하는 것이 좋습니다. 하나의 큰 덩어리로 DOM을 통해로드하는 경우 이 많습니다. 또한 CLI 측 PHP 스크립트를 사용하여 작업 속도를 높입니다.

1

가장 효율적인 방법은 정적 XSLT를 만들고 XSLTProcessor을 사용하여 XML에 적용하는 것입니다. 메소드 이름은 다소 오도 된 것입니다. 평이한 텍스트를 출력하고 싶을지라도 문자열 변수로 필요하면 transformToXML()을 사용해야하고 파일을 쓰려면 transformToURI()을 사용해야합니다.

0

메모리 요구 사항에 따라 parse it with XSLT (메모리 사용 경로)을로드하거나 forward-only cursor을 만들고 직접 트리를 이동하여 원하는 값 (메모리 사용량)을 인쇄 할 수 있습니다. 효율적인 경로).

10

PHP의 xml parser functions을 사용하여 예전의 SAX-based parsing 접근 방식으로 XML을 읽고 청크 할 수 있습니다.

이 방법을 사용하면 한 번에 전체 버퍼를 읽고 구문 분석하기 때문에 구문 분석 할 수있는 문서의 크기에는 실제 제한이 없습니다. 파서는 태그, 데이터 등을 발견했음을 나타 내기 위해 이벤트를 발생시킵니다.

태그의 시작과 끝을 가져 오는 방법을 보여주는 simple exampl e가 설명서에 있습니다. 귀하의 목적을 위해 xml_set_character_data_handler을 사용하여 태그 사이의 텍스트도 인식 할 수 있습니다.

1

이것은 SAX가 설계 한 것입니다. SAX는 요소, 문자 데이터 등을 만날 때 작은 데이터 버퍼 및 이벤트 발생시 메모리 공간이 적습니다.

SAX를 사용하는 방법이 항상 명확하지는 않습니다. 처음에는 그렇지 않았습니다. 그것을 사용했지만 본질적으로 당신은 자신의 상태를 유지해야하고 문서 구조 내에서의 위치를 ​​볼 필요가 있습니다. 그래서 일반적으로 문서의 어떤 부분을 설명하는지 변수로 끝납니다 inFoo, inBar 등 특정 시작/끝 요소를 만날 때 설정합니다.

here

1

풀 구문 분석이 길을 가야하는 것입니다 SAX 파서에 대한 간단한 설명과 예제가있다. 이렇게하면 메모리 효율적이고 처리가 쉽습니다. 50Mb 이상의 파일을 처리하고 있습니다.