Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


About JDOM & JDOM Programming with Java
 
이번글에서는 SAX와 DOM의 자바변형판인 JDOM에 대한 개요와 프로그래밍 방법에 대하여 알아보도록 하자. ( 2003/03/17 ) 317
Written by ienvyou - 최지웅
1 of 1
 

이번글에서는 SAX와 DOM의 자바변형판인 JDOM에 대한 개요와 프로그래밍 방법에 대하여
알아보도록 하자.

▶ About JDOM

    - Java-Centric, Object Oriented
    - 각 파서의 구현방식이 다른데서 나타나는 비일관성의 문제 해결제시
    - SAX, DOM과의 조화
    - Loosely coupled XML
    - License Free, Open Source


Jason Hunter와 Duncan Davidson과 함께 디자인하여 만들었으며 그들의 웹사이트(www.jdom.org)에는
직관적이고, 복잡한 XML을 조작하는 것이 아니라, Java API를 사용하는 것처럼 간단하고, 
자바중심적이며, 자바최적화(java optimized)를 지향하고 있다.

SAX는 이벤트기반의 document파싱과 처리를 할 수 있는 빠르고 강력한 기능을 제공하는 
API인반면, DOM은 매우 유연한 구조를 가지고 있지만 늦은 처리시간과 document처리절차가 
복잡하다는 난점을 가지고 있는데, JDOM은 이러한 SAX의 빠른 수행속도와 DOM의 높은 
유연성 등의 장점을 적절히 혼합해 놓은 형태라 봐도 무방하다. 

Loosely coupled란 말은 SAX나 DOM에 기반하여 모델링 되지 않았기 때문에 XML과는 
느슨한 연결이라 할 수 있다.

DOM의 경우 XML document의 처리에 있어서 내용을 모두 메모리상에 올려놓은 후 조작하게 
되므로 실제 큰 용량의 XML document의 처리시 로딩시간, 검색, 삭제 등의 시간이 다량 소모된다는 
단점을 가지고 있었다. 

이에 SAX의 등장을 낳게 되었는데 SAX는 데이터를 접근하는 방식이 객체지향적인 방법이 
아니라  이벤트 중심적인 성격으로 옮겨가야 한다는 것이었다.

 JDOM은 SAX와 DOM의 단점인 이벤트 중심적이고, document에 대한 메모리 로드가 아니라,
 자바의 객체지향적이며, 메모리상의 로드를 요구하지도 않는다는 직관적 
 document object model을 제공하도록 한다.

▶ JDOM API

    org.jdom
    org.jdom.input
    org.jdom.output
    org.jdom.adapter
    org.jdom.filter 
    org.jdom.transform 

org.jdom : Attribute, CDATA, Namespace, Document, Comment등등의 주요핵심클래스들로 구성되어 있다.

org.jdom.input : JDOMFactory인터페이스가 존재하며 XML소스로부터 DOM, SAX형태의 Document객체를 
생성하는데 사용된다.

org.jdom.output : 출력에 관련된 클래스가 존재하며 DOM,SAX API와 adapting하여 XML을 출력해주는 
DOM,SAX의 Outputter와 JDOM자체의 XML로 출력시켜줄 수 있는 XMLOutputter클래스가 존재한다.

org.jdom.adapter : 현재 사용될 수 있는 DOM에 대한 공통인터페이스를 제공한다.(API참조)

org.jdom.filter : JDOM object에 대한 filtering을 수행한다.

org.jdom.transform : JDOM document의 tree와 source에 대한 핸들링을 담당한다

JDOM은 DOM과 SAX에 대한 핸들링을 모두 처리할 수 있다. 다음에 나오는 간단한 JDOM프로그램을 
작성해 봄으로서 JDOM의 사용방법을 익혀보도록 하자

JDOM을 이용하여 SAX방식의 처리를 어떻게 하는지와 java api와의 연계가 얼마나 쉬워질 수 
있는 지를 알수 있는데,  SAX의 빠른 속도와 DOM의 유연성있는 특징을 모두 가질 수 있는 
간단한 코드로 JDOM으로 실체를 보여본다.

먼저 프로그램을 작성하고 실행하려면 JDOM에 대한 패키지가 필요함은 물론이며 아래의 사이트에서
다운받도록 하자.

JDOM site : http://www.jdom.org/downloads/index.html

위의 사이트에서 JDOM에 대한 다운로드를 받고 전에 SAX나 DOM처럼 해당 패키지가 있는 곳에
압축을 풀어넣도록 하자.

아래의 코딩을 한다.

▶JDOM을 이용한 간단한 HelloWorld프로그램

9:     import org.jdom.Element;
10:   import org.jdom.Document;
11:   import org.jdom.output.XMLOutputter;
21:   public class JDOMHelloWorld {
22:   	public static void main(String [] args) {
24:   		Element root = new Element("MultiCampus");
27:   		root.setText("HelloWorld!");
30:   		Document doc = new Document(root);
32:   		try {
33:   			XMLOutputter out = new XMLOutputter();
35:   			out.output(doc, System.out);
36:   		}catch(Exception e) {
37:   			e.printStackTrace();
38:   		}
39:   	}
40:   }


Line 9~11 : 일반적인 DOM, SAX의 API와 마찬가지로 jdom의 패키지 클래스를 import하는 데 
9라인의 Element는 xml의 element와, document 또한 xml의 document와 매핑되면 jdom의 출력을 
지원할 수 있는 XMLOutputter클래스를 정의

Line 24 : Multicampus라는 XML Element를 새롭게 생성한다.
Line 27 : 해당 element에 HelloWorld라는 값을 부여한다.
Line 33 : 출력을 담당한 XMLOutputter의 객체를 생성한다.
Line 35 : 현재 가지고 있는 document를 default출력장치인 screen으로 출력한다

▶ SAX를 이용한 JDOM Program 

1:   SAXBuilder builder = new SAXBuilder();
2:   Document doc = builder.build(new File(args[0]));
3:   DocType docType = doc.getDocType();
4:   Element root = doc.getRootElement();
5:   trace("Input File : " + args[0]);
6:   if( docType == null ) {
7: 	    trace("DocType is null !!");
8:   } else {
9:	    trace("getElementName() : " + docType.getElementName());
10:	    trace("getPublicID() : " + docType.getPublicID() );
11:	    trace("getSystemID() : " + docType.getSystemID() );
12:	    trace(docType.toString());
13:  }
14:  trace("root.getName() : " + root.getName());
15:  List children = root.getChildren();
16:  Iterator iter = children.iterator();
17: while( iter.hasNext() ) {
18: 	trace(iter.next().toString());
19: }


Line 1 : SAX파서로서 처리할 수 있도록 SAXBuilder의 객체를 생성한다.
Line 2 : SAX Builder를 이용하여 입력받은 파일을 파싱한다.
Line 3 : 파싱된 document의 document type을 얻어낸다.
Line 4 : 파싱된 document의 root element를 얻어낸다. 
Line 9~12 : DocType이 있다면 해당 요소의 ID를 찍는다.
Line 14 :  root의 이름을 찍는다.
Line 15~18 : root  element의 하위노드들은 Collection타입으로 변형한 후 child를 찍어보도록 한다.

▶DOM을 이용한 JDOM프로그램

DOM default parser를 이용하여 DOMBuilder의 객체를 생성하며, SAX의 building방식과 동일하다.
위의 방식에서는 DOMBuilder의 객체를 생성하여 파일을 읽어들이고 파싱하게 된다.
또 다른 방법은 DOM의 파일을 읽어들이는 방식은 SAX보다 훨씬 느리므로 SAX의 파일을 
읽어들이는 방식을 이용하여 JDOM document객체로 만든 다음 DOM으로 변환하는
방식을 취할 수도 있을 것이다

/*
 * @(#)DOMBuilderExample.java	1.00 2002.08.05
 *
 * 
 */

import java.io.File;
import java.util.List;
import java.util.Iterator;

import org.jdom.DocType;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.DOMBuilder;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
/**
 *	JDOM을 이용한 Simple DOMBuilder Class
 *	
 * 

* * @author Choi Ji Woong(carouser@dreamwiz.com) * @version 1.00, 2002.05.04 * @since Web F/W 1.0 */ public class DOMBuilderExample { public static void main(String [] args) { if( args.length != 1 ) showUsage(); SAXBuilder builder = new SAXBuilder(); try{ Document doc = builder.build(new File(args[0])); DocType docType = doc.getDocType(); Element root = doc.getRootElement(); trace("Input File : " + args[0]); if( docType == null ) { trace("DocType is null !!"); }else { trace("getElementName() : " + docType.getElementName()); trace("getPublicID() : " + docType.getPublicID() ); trace("getSystemID() : " + docType.getSystemID() ); trace(docType.toString()); trace("=============================================="); trace("root.getName() : " + root.getName()); List children = root.getChildren(); Iterator iter = children.iterator(); while( iter.hasNext() ) { Object obj = iter.next(); trace(obj.toString()); trace("[Class Name] " + obj.getClass().getName()); } } }catch(Exception e) { e.printStackTrace(); } } public static void showUsage() { System.out.println("Usage : run DOMBuilderExample "); System.exit(1); } public static void trace(String data) { System.out.println("[ DOMBuilderExample ] " + data); } } 위의 프로그램은 앞서 보았던 SAXBuilder를 이용한 JDOM프로그램과 유사하다 다른점이라고는 SAX와의 차이처럼 메모리상에 해당 XML Document에 대한 내용을 이용하여 조작을 한다는 것이다. 특이한 점은 자바지향적이라고 했던 만큼 아래의 코드를 유심히 볼 필요성이 있다. List children = root.getChildren(); Iterator iter = children.iterator(); 보통 DOM에서는 NodeList를 통하여 DOM tree를 순회하게 하고 있지만 JDOM에서는 바로 getChildren()메소드를 통하여 자바쪽 오브젝트인 List의 객체를 얻어내어 바로 traverse할 수있는 조건을 마련해 놓고 있다. XML의 구조에 대한 어느정도의 이해만 있다면 자바에 대한 지식만으로도 충분히 코딩을 해낼 수 있을 정도로 쉬운 것이 바로 JDOM이다. 이번 편에서는 XML의 자바지향적인 JDOM에 대하여 살펴보았다.

 
1
References
 
JDOM site : http://www.jdom.org/downloads/index.html
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD