XML 문서는 트리 형태로 해석할 수 있다. 그러다보니 루트에서 따라내려가다가 XML 문서의 특정 서브트리 부분을 루트로하는 새로운 XML 문서를 만들고 싶은 경우가 있다.
예를 들어 다음과 같은 XML Document가 있다고 하자.
<root>
<node1>
<subnode1>value 1</subnode1>
</node1>
<node2>
<subnode2>value 2</subnode2>
</node2>
<node3>
<subnode3>value 3</subnode3>
</node3>
</root>
XPath 등을 이용해서 에 해당하는 Node 객체를 얻어왔을 때 노드의 서브 트리를 Root로 하는 새로운 Document를 얻어오고 싶을 경우가 있다.
<node3>
<subnode3>value 3</subnode3>
</node3>
org.w3c.dom.Document 인터페이스에는 importNode() 라는 메소드가 있으며, 이 메소드를 이용해서 새로운 Document를 만들 수 있다. org.w3c.dom.Node 클래스를 Root로 하는 새로운 org.w3c.dom.Document를 만드는 예제 코드는 다음과 같다.
public Document getNewDocumentFromNode(Node root) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// XML Namespace
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
// New document
Document document = builder.newDocument();
// Copy Subtree nodes
Node importedNode = document.importNode(root, true);
// Append copied subtree to the new document
document.appendChild(importedNode);
return document;
}
이렇게 사용하면 XML을 파싱한 DOM 트리의 각 Element 들이 새로 복사되어 Document를 구성하게 된다.
댓글