[Java 강좌] XMLStreamWriter, XMLStreamReader, XmlFactory

공부/Java  2015.05.26 22:31


안녕하세요. 명월입니다.
이번 포스팅에서는 XML입출력에 대해서 알아보도록 하겠습니다.

프로그램을 작성하다보면 파일 입출력을 사용하는 곳이 정말 많습니다. 예를 들면 환경파일 읽기,쓰기 로그 파일 작성하기, 데이터 전문, 버퍼 등등…
그중 XML을 읽고 쓰기를 알아보도록 하겠습니다.
우리가 예전에 환경파일을 설정하면 Ini, csv, binary 형태로 저장하는 경우가 많았습니다. 그러나 최근에는 xml형태로 저장하는 경우가 많아졌습니다.

먼저 그럼 Xml이 무엇인지 대해 자세히 알아보도록 하겠습니다.
Xml이란 인터넷을 찾아보면 eXtensible Markup Language의 약자로 확장성이 있는 마크업 언어라고 정의 되어있습니다. 확장성이 있는 마크업 언어라… 설명이 어렵네요.
그렇다면 제가 조금 쉽게 풀어서 설명하자면Xml이란 동적으로 정의가 가능한 데이터 포멧이라고 정의하고 싶군요.
무슨 뜻인지 해석을 하면 기존 ini는 해당 항목, 파라미터가 있어서 그 파리미터를 지정을 해서 취득을 하는 형식, 즉 항목 = 값의 형식으로 취득을 하였습니다. 그리고 csv는 콤마(,)를 구분으로 데이터값을 구분하여 레코드형식으로 취득을 하였습니다. 이러한 문제점은 그 파라미터 이상의 값을 지정할 수 없고 프로그램에서도 파라미터 및 컬럼을 정의함으로서 사용하는 형식이었습니다.그러나 xml은 열고 닫음의 태그를 사용하고 그 노드 안의 다른 xml의 형식이 존재함으로써 동적으로 값을 표현하고 값을 취득하는 형식이 되겠습니다.

설명이 복잡하네요. 그냥 단순히 binary 데이터 이고 열고 닫고의 기준으로 데이터가 취득이 가능하다고 생각하시면 간단합니다. 확장적인 동적 문서라 해도 Ini나 csv도 솔직히 다 구현할 수 있습니다.
여기까지가 XML의 설명이고 이제 이 XML을 읽고 쓰는 부분을 알아보도록 하겠습니다.

XML을 읽고 쓰는 부분도 결국에는 Stream을 상속받아서 이 전 포스팅에서 사용한 FileStream과 비슷합니다.
그러나 조금은 다른 것이 있다면 FileStream은 new 부분에서 File을 입력 받아 선언한 반면 XmlStream은 new가 아닌 팩토리에서 인스턴스 객체를 가져오는 형태로 구현이 되겠습니다.

그럼 팩토리는 무엇일까요? 팩토리는 디자인 패턴 중의 하나로 객체를 인스턴스 화하여 하위 객체가 어떤 형태로 사용하더라고 확정성을 확보하겠다라는 의미(?)로 사용됩니다. 기회 있으면 디자인 패턴도 포스팅을 하고 싶네요.

이 부분은 간단하게 넘어가고 어쨋든 이런저런 문제로 Factory 패턴을 사용합니다. 그럼 아래의 예제로 확인을 해보겠습니다.


먼저 Factory에서 클래스 객체를 가져왔습니다. 그리고 FileWriter 클래스로 파일을 지정합니다.
writeStartDocument 함수를 호출을 하게 되면 의 형태 선언부가 생성됩니다. 그리고 나서 Document 태그를 열고 그 안에 data 태그를 열었습니다.
그 data 태그의 name속성은 value값으로 넣었습니다. 태그의 값으로는 Hello World 값을 열고 차례로 노드를 닫았습니다.
최종적으로는 메모리를 파일로 옮겨 담고(flush) Stream.close()를 하였습니다.

결과는 원하는 디렉토리 안에 a.xml 파일이 생성되었고 XML의 데이터는 워하는 데이터 대로 생성이 되어있습니다.

XmlStreamwriter 클래스의 대해 자세한 API 설명은 아래의 URL에서 자세히 알아보시기 바랍니다.
http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamWriter.html

이번에는 Xml을 읽어드리는 예제를 살펴보겠습니다.



위 소스는 제가 실제 작성한 소스가 아니고 공식 홈페이지에서 가져온 소스입니다. 공개 소스인데 중간에 틀린게 있어서 제가 약간 수정은 했습니다.

간단하게 설명을 하자면 작성하는 클래스와 마찬가지로 팩토리로 부터 인스턴스를 받아와서 FileReader클래스로 읽어드렸습니다.

그리고 각 노드의 타입별로 분기를 시켜서 출력하는 형태로 만들었습니다. 결과화면은 아래와 같습니다.


예상했던 결과대로 데이터가 나왔네요..

XmlStreamReader 클래스의 대해 자세한 API 설명은 아래의 URL에서 자세히 알아보시기 바랍니다.

http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamReader.html

여기까지 입니다

댓글 0개가 달렸습니다.
댓글쓰기