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 DOM & DOM Programming with Java
 
DOM이 무엇인지에 대하여 간략한 개요를 먼저 보도록 하겠고, DOM Level 1, 2, 3의 개략적인 내용과 DOM을 이용한 자바프로그래밍 방법에 대하여 알아보고자 한다. ( 2003/03/13 ) 419
Written by ienvyou - 최지웅
1 of 1
 

이번글에서는 DOM(Document Object Model)에 대하여 알아보도록 하자. 
DOM이 무엇인지에 대하여 간략한 개요를 먼저 보도록 하겠고, DOM Level 1, 2, 3의 개략적인
내용과 DOM을 이용한 자바프로그래밍 방법에 대하여 알아보고자 한다.

▶ About DOM

    - W3C에서 제안
    - Level 1 Recommendation : 1998.10
    - Level 2 Recommendation : 2000.11
    - Level 3 Working Draft : 2002.1
    - XML Document의 조작 방법 제공
    - Java Script에 이식성을 부여하려는 목적에서 제안

DOM은 document를 구성하고 있는 부분들을 조작해줄 수 있도록 하는데  이 말을 달리하면 DOM을 
이용하게 될 때 document의 요소를 표현하는 객체들에 대한 조작으로서 각각의 섹션사이를 옮겨다닐 수 
있다. 이는 navigation or manipulate라는 용어로 대변이 될 수 있으며, document를 객체양식으로 
표현한 모델이라 할 수 있다.

또한 Javascript(javascript는 동적이며 웹브라우져 종류에 관계없이 동일하게 사용할 수 있다)의 
이식성부여목적에서 제안되었으며,  DOM의 시초는 동적인 HTML의 한부분으로서 시작되었다고 
할 수 있는데 DOM은 HTML요소들의 생성, 갱신, 삭제를 위해 사용되는 
자신의 객체들과 HTML사이의 매핑을 제공해 줄 수 있도록 한다.

DOM의 중요한 목적은 광범위한 환경과 응용프로그램에서 표준적인 프로그래밍 인터페이스를 
제공하기 위한 것으로 개발자는 문서의 생성,문서구조의 탐색,내용의 추가,삭제,수정을 API인 DOM을
통해 수행 할 수 있다.W3C는 이러한 기능을 프로그램 언어 중립적으로 만들기 위해 
OMG(Object management Group)의 IDL(Interface Definition Language)를 사용하여
DOM API 명세를 만들었다.

▶ DOM의 특징

- DOM 사양은 XML과 HTML 을 위한 programmatic interface를 정의한다.
- DOM은 논리적 문서구조를 통해 프로그램이 문서에 접근하는 방식을 정의 하며, 객체지향 모델의
'객체모델' 을 따서 지어진 이름이다.
- DOM을 사용하여 응용프로그램 개발자는 컴퓨터 기종과 프로그램밍 언어의 종류에 관계없이 문서를 
생성하고 문서의 내용과 구조를 동적으로 접근하고 조작할 수 있다

▶ DOM Level 1

    - 97년후반 시작 98년 권고안발표
    - Document class와 Method만을 제공
    - http://www.w3c.org/tr/red-dom-level-1
    - DOM serialization, persistence기능제공 안함
    - 2000년 11월 DOM Level 1 Second Ed.발표


W3C의 권고안(recommendation:표준이 아니라 표준에 준하는 명칭을 표현하는 용어)으로서 최근 
발표시기는 1998년 10월 1일이다.
실제 기본적인 클래스만을 제공했으며 XML파일을 읽어 메모리로 로드하거나 DOM을 구성하는 
데이터들을 읽어들여 파일로 저장하는 메소드들은 제공이 되지 않았다.

2000년 11월 Vidur Apparao, Steve Byrne, Mike Champion, Scott Isaacs, Ian Jacobs, Arnaud Le Hors, 
Gavin Nicol, Jonathan Robie, Robert Sutor, Chris Wilson, Lauren Wood 에 의하여 Second Edition을 
발표하게 된다.

▶ DOM Level 2

    - 2000년 11월 W3C 권고안으로 확정
    - Level 1의 대체가 아닌 기능추가의 형태
    - 기존의 CORBA2.2에서 CORBA2.3.1 IDL 추가
    - XML Namespace처리의 추가
    - XML, HTML, StyleSheet, CSS등의 처리에 대한 구체적 인터페이스 제공

DOM Level2는 기존의 Level1이 구식이 되게끔 완전히 대체하는 것이 아닌 몇가지 기능의 추가로  
기존의 Level1에서 사용되었던 내용에 덧붙인 형태로 권고안을 발표했다.
Level1에서 제공되는 CORBA2.2의 매핑을 CORBA2.3.1의 IDL추가와 XML Namespace에 대한 처리기능이 
추가되었고, Core, Views, Styles, Events, Traversal and Range의 권고안을 통하여 Document에 대한 
구체적인 인터페이스를 제시하고 있다.

▶ DOM Level 3

    - 2002년 4월 Level3 최종 working draft 발표
    - Views and Formatting, Abstract Schemas의 Level 3제외
    - Load and Save, Validation, Event, XPath 
    - DOM Level 2를 기본으로 설계

2002년 4월 최종 draft가 발표되었으며, 기존에 없었던 load and save기능의 추가가 강력하다고 
할 수 있는데, DOMInputStream과 DOMOutpuStream을 이용하여 write할 수 있는 특징을 가지고 있다.
또한 DOM Xpath: XPath1.0을 사용하여 DOM Tree에 질의할 수 있는 기능을 제공하고,
Validation(Document의 DTD에 대한 validation체크)을 할 수 있는 기능을 제공한다.
Event 모델 : Level 2의 Events 모델과 거의 흡사하며 마우스, 키보드등과 같은 이벤트 지향적인
XML트리를 포함한다.

▶ XML의 DOM Tree표현

아래와 같은 XML 도큐먼트가 있다고 가정하자.

<?xml version="1.0">
<address-book>
    <person>
        <name>Choi ji woong</name>
        <address>Seoul</address>
        <phone>011-xx</phone>
    </person>
    <person>
        <name>jeon hong seong</name>
        <address>Suji</address>
        <phone>016-xx</phone>
    </person>
</address-book>

위의 내용을 실제 우리가 볼수 있는 논리적인 객체모델로 표현한다면 아래와 같은 그림이 된다.



위에서 보는 것처럼 각각의 요소들이 트리의 구조로 표현될 수 있으며, 내가 원하는 요소에 대하여
트리간의 이동을 통해 찾을 수 있기때문에 검색, 수정, 삭제가 용이하게 된다.
DOM은 이와 같이 원하는 대로 문서에 접근할 수 있도록 해주는 오브젝트로서 XML이나 HTML문서에 
대한 API를 제공하고 있다.

▶ DOM의 작동방식



DOM 은 XML파서와 애플리케이션 사이의 계층에 놓여진다.
DOM은 그림에서 볼 수 있듯이 SAX(Simple API for XML) 파서에서 얻어진 결과를 이용하여
문서 객체 모델인 DOM을 만들어 낸다.

DOM 생성과정을 살펴보면..
먼저, 파서는 DOM 에서 제공하는 DocumentBuilder 를 통해 원본 XML Document 를 파싱하기 위해
Document Handler를 생성하고,  파서는 SAX에서 제공하는 Document Handler를 통해 입력된 원본 
XML 문서를 파싱하여 Document 객체를 생성시키고 엘리먼트와 문자열이 들어올 때마다 DOM자료 
구조를 차례로 만들어 나간다. 

DOM을 이용하여 XML 도큐먼트에 접근 할 수 있는 애플리케이션을 만들기 위해서는 XML파서가 
설치되어 있어야 하며 아래의 사이트에서 다운받을 수 있다.

Xerces : http://xml.apache.org/xerces2-j/index.html
Sun XML : http://java.sun.com/xmlDOM의 Interface



DOM 구현에는 여러 형식이 존재한다. 기본 Document 인터페이스인 DOM Core와 HTML 모듈인 DOM HTML, 
CSS 모듈인 DOM CSS등이 있으며 DOM Core 인터페이스는 기초 인터페이스(Fundamental Interfaces)와 
확장 인터페이스(Extended Interfaces)로 나뉘어질수 있고, DOM구현시 자신만의 속성과 메소드를 추가하여 
인터페이스를 확장할 수 있다.

이에 대한 API는 모두 파서에 대한 document API를 여러분들이 참조해야 하며, API사용방법은 트리의
개념을 알고 있다면 의외로 간단하다.

▶ Simple DOM Programming with Java
// DOMSample.java

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;

public class DOMSample {
    public static void main(String [] args) {
        Document doc;
        try{
            // DOM Document를 생성하기 위하여 팩토리를 생성한다
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setIgnoringElementContentWhitespace(true);
            // 팩토리로부터 Document파서를 얻어내도록 한다.
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            // Document DOM파서로 하여금 입력받은 파일을 파싱하도록 요청한다.
            doc = builder.parse(new File(args[0]));

            //파싱된 후의 루트요소를 얻어내보도록 하며, 그 타입은 Element타입이다.
            Element root = doc.getDocumentElement();

            //주석을 한번 추가하여 달아본다.
            Comment comment = doc.createComment("Training test");
            // 만들어진 주석을 루트원소의 자식으로 추가한다.
            root.appendChild(comment);
            
            // 루트원소의 각종 정보를 출력해보도록 한다
         System.out.println("Tag name : " + 
                               root.getTagName());
         System.out.println("Node type : " +
                                  root.getNodeType());
         System.out.println("First Child : " + 
                                  root.getFirstChild().getNodeValue());

            // 현재 메모리에 올라와 있는 DOM Document를 화면에 출력해본다.
            // 다른 예를 파일 출력도 가능하다.
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            transformer.transform(new DOMSource(doc), new StreamResult(System.out));
        }catch(Exception e) {
            System.out.println(e);
        }
    }
};
Sample.xml <?xml version="1.0"> <address-book> <person> <name>Choi ji woong</name> <address>Seoul</address> <phone>011-xx</phone> </person> <person> <name>jeon hong seong</name> <address>Suji</address> <phone>016-xx</phone> </person> </address-book> 실행 방법 set SAMPLE_HOME=당신이 설치한 XML파서를 위한 jar파일이 있는 디렉토리 javac -classpath .;%SAMPLE_HOME%\crimson.jar;%SAMPLE_HOME%\xalan.jar; %SAMPLE_HOME%\jaxp.jar;%SAMPLE_HOME%\xerces.jar -d . %1 %2 %3 %4 %5 java -classpath .;%SAMPLE_HOME%\crimson.jar;%SAMPLE_HOME%\xalan.jar; %SAMPLE_HOME%\jaxp.jar;%SAMPLE_HOME%\xerces.jar -d . %1 %2 %3 %4 %5 이상으로 매우 간단하게 DOM에 대한 개요를 보았다. 모든 것들이 그러하듯이 이렇게 글로 표현한다는 것은 상당히 힘든일이다. 이 이상에 대한 것은 여러분들이 직접 파서를 다운받아 설치하고 소위 "맨땅에 헤딩해보다"라는 것처럼 문서 읽어보고 해결점을 찾아내고 API를 다룰줄 알아야 하는 것은 물론이다. 좀 더 나아갈 바를 원한다면 자신의 노력없이는 불가능할 것 같다. 이상으로 DOM에 대한 소개를 마친다.
 
1
References
 
Xerces : http://xml.apache.org/xerces2-j/index.html
Sun XML : http://java.sun.com/xml
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD