본문 바로가기
Old Posts/Java

[Java] XML 서브 트리를 루트로하는 새로운 XML Document 생성 (org.w3c.dom.Node 클래스를 Document로 변환)

by A6K 2021. 7. 28.

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를 구성하게 된다.

댓글