만자의 개발일지

[Java] DocumentBuilderFactory 와 DocumentBuilder 본문

Java/Java

[Java] DocumentBuilderFactory 와 DocumentBuilder

박만자 2022. 1. 14. 10:22

최근에 Java로 SOAP API를 사용할 일이 생겨서 구글링을 통해 어떻게 XML 데이터를 전송할까 찾아보다 DocumentBuilderFactory와 DocumentBuilder의 존재에 대해 알게되었다,

그래서 오늘은 이 두 클래스에 대해 정리해보고자 한다.

 

DocumentBuilderFactory

공식 문서에 보면 DocumnetBuilderFactory에 대해 이렇게 정의하고 있다.

Defines a factory API that enables applications to obtain a parser that produces DOM object trees from XML documents.

DocumentBuilderFactory 클래스로 XML 문서에서 DOM 오브젝트 트리를 생성하는 parser를 얻을 수 있다고 한다.

 

자세한 내용은 아래 공식문서를 참고하면 된다.

https://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

 

DocumentBuilderFactory (Java Platform SE 7 )

Obtain a new instance of a DocumentBuilderFactory from class name. This function is useful when there are multiple providers in the classpath. It gives more control to the application as it can specify which provider should be loaded. Once an application h

docs.oracle.com

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);

위 코드는 DocumentBuilderFactory 인스턴스를 생성하는 예제이다.

DocumentBuilderFactory.setNamespaceAware(boolean awareness) 함수는 XML을 파싱할 때 Namespace의 지원여부를 지정해 줄 수 있다. XSLT를 사용하기 위해서는 필수 옵션이다.

자주쓰이고 유용한 함수니 메모..

 

DocumentBuilder

아래는 공식 문서에서 정의한 DocumentBuilder 이다.

Defines the API to obtain DOM Document instances from an XML document. Using this class, an application programmer can obtain a Document from XML.

An instance of this class can be obtained from the DocumentBuilderFactory.newDocumentBuilder() method. Once an instance of this class is obtained, XML can be parsed from a variety of input sources. These input sources are InputStreams, Files, URLs, and SAX InputSources.

DocumentBuilder 클래스는 XML 문서에서 DOM Document instance를 얻는다고 한다. 이 DocumentBuilder 클래스를 사용하면 XML 로부터 Document를 얻을 수 있다고한다.

 

DocumentBuilder의 인스턴스를 할당하기 위해서는 DocumentBuilderFactory.newDocumentBuilder() 메소드를 사용해야 한다고 한다. 이름에서부터 나와있듯이 팩토리 패턴을 사용한다.

다른 클래스의 인스턴스를 가지고 객체를 생성하면 팩토리 패턴이다.

 

DocumentBuilder를 가지고 XML 입력 소스에서 XML을 파싱할 수 있는데 여기서 사용되는 입력 소스로는 InputStreams,Files, URL, SAX InputSources가 있다고한다.

자세한 내용은 아래 공식 문서를 참고.

https://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilder.html

 

DocumentBuilder (Java Platform SE 8 )

Defines the API to obtain DOM Document instances from an XML document. Using this class, an application programmer can obtain a Document from XML. An instance of this class can be obtained from the DocumentBuilderFactory.newDocumentBuilder() method. Once a

docs.oracle.com

 

예제를 통해 살펴보자.

String inputXMLSource = "<?xml version="1.0" encoding="utf-8"?> ~";
// DocumentBuilder.parse()함수로 XML파일 파싱 
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
DOMSource domSource = new DOMSource(builder.parse(new InputSource(new StringReader(inpuxXMLSource))));
//Transformer 인스턴스 할당
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// DOMSource(DOM 트리)를 .xml파일로 변환
StreamResult result = new StreamResult(new File( "./dom.xml"));
transformer.transform(domSource, result);

위에서는 언급하지 않은 Transformer 클래스가 있는데 그냥 XML에서 파싱한 DOM오브젝트를 다시 XML로 변환해주는 역할이라고 생각하면된다. try-catch 구문은 가독성을 위해 생략한 것이니 실제로 구현할 때에는 꼭 넣어줘야한다.

~ 표시 에는 자신의 XML코드를 넣어주면 된다.

DOMSource라는 객체가 나왔는데 DOMSource는 DocumentBuilder 로 파싱한 DOM 의 트리형태이다. 

 

DocumentBuilderFacotory.newDocumentBuilder() 메소드를 통해서 DocumentBuilder 인스턴스를 할당받고 

StringReader 클래스로 XML 소스를 String으로 담고 그 인스턴스를 InputSource 클래스 생성자로 넘겨준다. 

그다음 DocumentBuilder.parse(InputSource is) 함수를 이용해서 InputSource 인스턴스를 받고 Document 클래스를 반환하여 DOMSource 라는 클래스의 생성자로 넘겨준다.

 

DOMSource 의 생성자를 보면 매게변수로 Node 타입의 인자만 받는다고 나와있는데, Document 가 Node를 상속받고있기 때문에 가능하다.

 

그 다음 Transformer 클래스로 DOMSource(DOM 트리)를 다시 .xml 파일로 변환시켜 줄거다.

 

실행을 시켜보면 아래처럼 현재위치에 dom.xml 파일이 잘 생성된것을 볼 수 있다.

 

'Java > Java' 카테고리의 다른 글

[Java] ArrayList 상속으로 foreach 구현  (0) 2022.01.17
[Java] SOAP API 사용하기 (feat.Maven)  (0) 2022.01.17
[Java] new 연산자란  (0) 2021.06.21
[Java] 리터럴(literal)이란?  (0) 2021.06.18
[Java] Call by value 와 Call by reference  (0) 2021.06.16
Comments