2013-02-21 3 views
1

JAXP를 사용하여 매우 큰 XML 파일을 DOM 트리에로드하고 결과를 DOM에 수정하고 XPath 쿼리를 실행하려고합니다.DOM 노드의 Java, XPath

지연로드를 사용하여 구현 된 자체 DOM 구현을 사용합니다. 즉 처음에는 DOM의 처음 두 레벨 만 파일에서로드되고 getChildNodes()/etc.가 호출되면 파일로 돌아갑니다 더 많은 레벨로드). 이것은 매우 느리지 만 훨씬 더 큰 파일을로드 할 수 있습니다. 특히 파일의 일부만 사용하는 경우 더욱 그렇습니다.

내 질문 : XPath는 XML에 대한 다른 시각 (afaik)을 사용하고 있습니다. 기본 Oracle JDK 구현이 전체 DOM 문서를 일부 내부 XPath 문서로 변환하는 경우 (전체 문서를 열심히 읽으므로 정말 나쁠 것입니다) 또는 XPath 구현이 직접적으로 작업 할 수 있는지 궁금합니다. DOM 트리 (XPath가 이미로드 된 요소 내에서 평가 될 수있는 경우 더 이상로드되지 않음)

+1

당신은 _ 매우 만족 _ big_ 무엇을 의미합니까 ...이 모든 경우에 정말 나쁜, 정말 나쁜해야 하는가? 그리고 런타임 동안 메모리 소비량을 살펴본다면 당신의 질문에 답을 얻지 못할 것입니까? – jlordo

+0

왜 XPath가 DOM이 아닌 다른 것을 사용하고 있다고 생각합니까? FWIW, 내가 보았던 적어도 하나의 버그가 있습니다.이 버그는 일반적인 형태로 DOM을 사용하고 있음을 나타냅니다 (버그는 트리 전체의 컨텍스트를 기반으로 전체 DOM을 탐색하는 것을 포함합니다). – parsifal

+0

스펙은 DOM을 기본 모델로 언급하지 않으며 Apache Xalan-J 구현 (Oracle JDK에서 afaik로 사용됨)은 일종의 DTM (http://xml.apache.org/xalan-j)을 사용하는 것으로 보입니다 /dtm.html). 그러나 DOM이 DTM에서 완전히 변형되었거나 XPathExpression을 평가하는 데 필요한 특정 부분 만 DTM이 DOM에 대한 어댑터 일 경우 아직 알 수 없습니다. –

답변

0

따라서 지금이 테스트 수 :

을 불행하게도 공식 JDK 구현뿐만 아니라 현재의 Xalan-J 구현이를 평가하기 전에 내부 데이터 구조에 전체 DOM 트리를 변환하는 통로. 당신이 게으른 DOM 구현을 가지고 있지 않더라도

2

몇 줄의 코드로 테스트 할 수 있습니다. DOM을 XPath 평가자에게 제공하고 몇 가지 중단 점/디버그 인쇄물을 DOM 메소드에 넣기 만하면됩니다. 그들이 검색되어서는 안되는 요소를 요구 받으면 자체 트리를 만듭니다. 예 : 문서의 첫 번째 자식 만 쿼리하고 실제로 검색 할 대상을 확인합니다.

또한 파일이 너무 큰 경우 근본적으로 다른 접근 방식을 확인할 수 있습니까? SAX이라고합니다.

우리의 DOM 구현이 이제 완료
+0

나는 조금 누워있었습니다. 우리의 게으른 DOM 구현은 아직 구현되지 않았습니다. 다른 접근 방법 중 XPath와 같은 방식으로 나중에 게으른 DOM 트리를 사용할 수도있는 경우 현재 연구하고 있습니다. 그래서 누군가가 기본 JDK XPath 구현에 대해 알고 있다면 궁금합니다 .DX 트리의 XPath는 추측 할 수없는 일반적인 경우입니다. –