2008-11-10 3 views
4

전체 문서를 복제 할 때 신뢰할 수 있고 구현에 독립적 인 방법을 찾고 있습니다. Javadocs에서는 Document상에서 cloneNode를 호출하는 것은 구현에 따라 다르다고 말합니다. 나는 아무도 변압기를 통해 문서를 전달하려고했지만 결과 노드에는 소유자 문서가 없습니다.Java DOM을 사용하여 전체 문서를 어떻게 복제 할 수 있습니까?

새 문서를 만들고 이전 노드에서 노드를 가져올 수 있지만 문서 메타 데이터가 손실 될 수 있습니다. 문서를 문자열에 쓰고 다시 구문 분석 할 때도 마찬가지입니다.

아이디어가 있습니까?

그건 그렇고, 내가 통제 할 수없는 이유 때문에 자바 1.4.2에 갇혀있다.

답변

2

그래도 quick'n'dirty 방법은 어떨까요? 전체 문서를 XML 문자열로 직렬화 한 다음 DOM Parser를 사용하여 구문 분석 할 수 있습니까?

직렬화 된 버전에 아무 것도없는 이유는 없습니다. 예를 들어 줄까?

메모리 소비는 전체 DOM을 복제하는 경우, 그것은 코멘트 중 일부는 지적으로

+0

이것은 고안된 예이지만 문서를 직렬화하면 정규화됩니다. (인접한 텍스트 노드가 결합됩니다.) 이 특별한 경우의 메모리 소비는 문제가되지 않습니다. –

+0

실제로 더 나은 예는 인라인 DTD가있는 문서입니다. no-op 변환기를 사용하여 DOM을 직렬화하면 DTD가 사라집니다. 물론, DOM을 직렬화하는 더 좋은 방법이 있다면, 나는 모든 귀입니다. –

6

... 어쨌든 작은 수 없습니다, 다른 한편으로는, 중요 할 수 있지만 것, 문제가있다 문서 직렬화 및 다시 구문 분석. 메모리 사용, 성능 고려 사항 및 정규화 외에도 프롤로그 (DTD 또는 스키마)의 손실, 캡처 될 필요가없는 주석 손실 가능성 및 중요한 공백이 될 수있는 손실이 발생합니다. 직렬화는 피해야합니다.

실제 목표가 기존 DOM Document 객체의 복사본을 만드는 것이면 프로그래밍 방식으로 메모리에서 처리해야합니다. 고맙게도 Java 5에서 사용할 수있는 기능을 사용하거나 패스 런스 변환 (pass-through transformation) 인 Xalan과 같은 외부 XSLT 라이브러리를 사용하여이 작업을 수행하는 상대적으로 쉬운 방법이 있습니다. 기본적으로의

TransformerFactory tfactory = TransformerFactory.newInstance(); 
Transformer tx = tfactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
DOMResult result = new DOMResult(); 
tx.transform(source,result); 
return (Document)result.getNode(); 

: 아래

는 Java 5 솔루션을 표시됩니다. 예외를 처리해야하며 변환기를 구성하고자 할 수도 있지만 독자의 연습 문제로 남겨 둡니다.

+0

이 방법으로 문서를 복사하려고했습니다. 그러나 isEqualNode()는 두 문서를 비교하면 false를 반환합니다. – ka3ak

관련 문제