2012-01-09 3 views
4

XPath 표현을 많이 사용하여 구문 분석하는 DOM 구문을 사용하는 클래스 중 하나를 마이그레이션하려고합니다. SAX 구문 분석입니다. DOM 구문 분석은 나에게 좋았지 만 구문 분석하려는 파일 중 일부가 너무 커서 서버 시간 초과가 발생했습니다. 나는 SAX 구문 분석과 XPath을 다시 사용하려는하지만 나는 내가 아무 생각이 없기 때문에 당신이 내가 단지 SAX 사용할 때 다음과 같은 코드가 얼마나 저를 도와주세요 수 가능 가능하고 그렇지 않은 경우 확실하지 않다 :SAX 파서는 Java에서 XPath를 사용할 수 있습니까?

Document doc = bpsXml.getDocument(); 
String supplierName = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/Party[@stdValue='SU']/Name/Name1"); 
String language = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue"); 
+0

잠깐, 왜 XPath로 DOM에서 SAX로 전환하고 있습니까? 파일을 웹에서 가져 오는 중이고 서버가 파일을 보내는데 너무 오래 걸리면 파일을 파싱하는 방법이 아닌 파일을받는 방법을 변경하십시오. – cdeszaq

+0

[관련 SO 게시물] (http://stackoverflow.com/q/1863250/777186)도 있습니다. 몇 가지 대답은이를 위해 사용할 수있는 도구와 API를 참조합니다. – jogojapan

답변

4

단순히 SAX 파서를 사용하면 XML 트리가 메모리에 표시되지 않습니다 (SAX가 메모리 효율성이 더 좋은 이유입니다). 새 XML 요소가 발생할 때마다 "이벤트"가 트리거됩니다. 나무에있는 곳을 "알기"위해 메모리에 문맥 (종종 부모 요소 스택)을 유지해야합니다.

메모리에 트리가 없기 때문에 XPath를 사용할 수 없습니다. 현재 "컨텍스트"(manuallay 관리 스택) 만 테스트하여 문서를 쿼리 할 수 ​​있습니다. SAX 파서는 파일에서 하나만 실행되므로 파일의 순서가 중요합니다.

다행히도 메모리에 XML 트리를 빌드하는 라이브러리 인 VTD-XML과 같은 다른 접근 방법이 있지만 구조 부분 만 파일의 실제 내용을 추출하지 않고 필요에 따라 내용을 추출합니다. XPath를 허용하면서 DOM 파서보다 훨씬 더 효율적입니다. 나는이 라이브러리를 직장에서 사용하여 ~ 700MB의 XML 파일을 XPath로 구문 분석합니다 (예 : 이상하지만 작동하지만 매우 빠름).

+0

아주 좋은 아이디어이지만 짧은 데이터가 포함 된 많은 XML 요소로 구성된 대용량 파일 (2GB 이상)이있을 때 잘 작동하지 않습니다. 실제로는 50/60 %의 필요한 메모리를 줄일 수 있습니다. 당신이 매우 큰 파일을 가지고 있으면 좋지만 충분하지 않습니다. 그리고 요즘 데이터는 점점 더 빠르게 성장하고 있습니다 ... – OGrandeDiEnne

+0

지난 몇 년 동안, 저는 VTD-XML로 2GB + 파일을 구문 분석했습니다. 그것은 아주 좋은 일을하고 기억은 전혀 문제가되지 않습니다. 그것을 시도하고 나쁜 경험을 했습니까? 더 많은 정보를 공유 할 수 있습니까? –

+0

얼마나 많은 메모리 (-Xmx)를 구문 분석 프로그램에 할당 했습니까? – OGrandeDiEnne

1

IMHO XML을 처리하는 가장 쉬운 방법은 XML 용 Streaming API 인 StAX을 사용하는 것입니다. DOM과 SAX의 장점을 결합하여 더 쉽게 마이그레이션 할 수 있습니다. SAX와 같은 XML 요소에 커서가 있지만 코드가 커서를 앞으로 이동시킵니다. 이것은 XML 처리 코드가 훨씬 더 읽기 쉽게된다는 큰 이점을 제공합니다. 또한 현재 XML 요소 만 메모리에 보유해야하기 때문에 메모리 문제를 해결합니다. 멋진 tutorial도 있습니다.

원래 질문에 대한 답변 : Google의 간단한 검색 결과에 따르면 널리 알려진 방식이 쉽지 않으므로 모든 맞춤 솔루션이 튼튼하고 유지 보수가 잘되어 있지 않으며 잘 테스트되지 않았다는 것을 의미합니다.

0

SAX 구문 분석 (또는 StAX)으로 전환하면 접근 방식을 완전히 변경해야합니다. 얼마나 많은 일이 될 것인지 완전히 이해하지 못했던 것처럼 보입니다. 조언이 이해되도록하려면 파일의 크기와 데이터의 처리 방법을 알아야합니다. 예를 들어, 데이터를 필터링하는 경우 문서 투영을 사용하는 XQuery 구현이 좋은 대답 일 수 있습니다 (실제로 배후에있는 SAX를 사용하여 실제로 관심이있는 데이터의 하위 집합 만 포함하는 트리를 작성합니다) .

관련 문제