오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
도입배경
XML문서를 읽거나 변경 또는 추가하는 프로그램을 작성하기 위해서는 어떻게 해야 하나?
사람이 XML 문서를 만드는 것이 아니라 프로그램에서 XML 문서를 만들려면?
만약 프로그램에서 XML 문서의 내용을 분석하고 사용하기 위해서는 사람이 보기 쉬운 문자열 형태가 아닌 다른 형태가 되어야 할 것이다. 이렇게 프로그램에서 사용하기 쉽게 변형된 자료를 메타데이터 라고 하며 XML에서는 DOM이 메타 데이터를 만드는 방법에 대한 표준이 된다.
개요
XML 문서를 트리 구조로 해석하고 트리 구조의 노드를 조작하여 문서를 다루기 위한 방법
XML 문서를 프로그램에서 사용 할 수 있는 객체로 변환
Java 언어에서는 클래스 라이브러리의 형태로 XML 파서를 사용 할 수 있으며 이것을 이용하면 메소드를 통해 XML 문서의 조작이 가능
DOM에 대한 표준 명세를 제공하는 곳은 http://www.w3c.org/DOM 이다.
보통 XML 파서를 이용하여 문자열 형태의 XML 문서가 DOM 구조를 가진 객체들로 생성 된다.
XML 파서들은 DOM을 생성 할 수 있도록 구성 되므로 별도로 DOM을 생성 할 필요 없이 생성된 DOM의 객체들을 이용하면 된다.
W3C에서 제공하는 DOM 객체 유형은 IDL(Interface Definition Language)과 Java, Java Script로 이용 할 수 있도록 구성되어 있지만 IDL 자체는 여러 언어로 변환 할 수있는 중간 언어 이므로 실제로는 IDL을 사용하지 않고 C++, VB, C#과 같은 언어들을 이용 할 수도 있다.
프로그램이나 스크립트에서 문서의 내용이나 구조, 스타일에 동적으로 접근하고 수정 할 수 있도록 해주는 특정 플랫폼과 특정 언어에 중립적인 인터페이스(IDL)의 집합
결국 DOM은 XML 문서를 처리하는데 필요한 메소드와 속성을 모아놓은 API의 집합
DOM에 대한 스펙은 W3C에서 DOM Level 1, DOM Level 2, DOM Level 3등으로 레벨 별로 발표됨
MS는 DOM과 관련하여 W3C에서 정의된 API들을 Microsoft XML Parser인 MSXML에서 직접 구현하여 지원함, DOM 레벨 1의 모든 부분과 DOM 레벨 2의 다수를 지원
Java 진영 역시 DOM을 지원하고 있는데 가장 대표적인 것이 JAXP이며 이중 org.w3c.dom 패키지가 DOM 레벨 1의 Core 부분을 그대로 자바로 옮겨 놓은 인터페이스 라이브러리로 대부분의 자바 기반의 파서나 도구들은 이 라이브러리를 그대로 구현 하여 제공 하여 DOM을 지원 함
XML 문서는 XML 파서에 의해 파싱이 이루어 지는데 이 과정에서 파일 형태의 문서를 토큰 단위로 분해한 다음 DOM에서 정의 한 객체 모델링 방식에 따라 트리 구조로 변환 하여 메모리로 올린다.
이렇게 트리구조를 형성 한 채 메모리로 올라오면 Application등에서 DOM 클래스 라이브러리를 이용하여 메모리에 올라와 있는 XML 문서등에 접근하여 여러 가지 작업을 진행 하는 것이다.
레벨 1 : XML과 HTML로 된 문서에 접근하거나 문서의 내용을 수정하는데 필요한 핵심 API 정의
레벨 2 : DOM 레벨 1을 보완하고 XML NameSpace와 스타일시트에 대한 지원이 추가
레벨 3 : Content Model과 Load&Save에 대한 부분이 추가, 문서안에서 노드를 식별하고 두 노드의 상대적 위치를 비교하고 한 문서에서 다른 문서로 노드를 이동하는 기능 등도 추가 되었다.
XML 문서를 다루는 프로그램을 작성 하는 경우 DOM(Document Object Model)과 SAX(Simple API for XML)라는 방식이 널리 이용됨
DOM이나 SAX를 이용하여 XML 문서를 다루는 프로그램을 제작 하기 위해서는 사용하는 환경에 적합한 DOM이나 SAX를 지원하는 모듈(XML 파서)을 준비해야 한다.
여기서는 SUN의 JAXP Reference Implementation이라는 패키지에 포함되어 있는 XML 파서를 이용한다. 이 패키지에는 DOM과 SAX를 모두 지원한다.
준비물(JAXP, Java API for XML Processing)
DOM, SAX를 지원하는 XML 파서
http://java.sun.com/xml 아래 Java Web Service Developer Package 1.2(jwsdp-1_2-windows-i586.exe)를 다운 받은후 실행하자. JAXP는 이 패키지 안에 포함되어 있다.(JDK는 설치 되어 있어야 한다)
설치를 정상적으로 마쳤다면 C:\jwsdp-1.2 디렉토리가 생겼으며 그아래 JAXP라는 디렉토리가 존재 할 것이다. lib 아래에는 6개의 jar 파일이 있는데 이들을 클래스 패스에 등록하자.(C:\jwsdp-1.2\jaxp\lib\jaxp-api.jar를 까먹지 말라.)
JAXP를 통해 사용 할 수 있는 Java XML 파서
http://xml.apache.org/dist/crimson/ 에 가서 crimson-1.1.3-bin.zip 파일을 다운 받는다.
적당한 곳에 압축을 풀고 cinson.jar 파일을 클래스 패스에 추가 한다.
XML Parser
파서란 컴퓨터에 입력된 정보를 처리하거나 해석 하는 프로그램
XML 문서를 다루는 프로그램을 자바로만 작성하는 것은 아니며 C, C++, C#, Perl, VBScript등 다양한 언어를 이용하는 것이 가능하다.
각 프로그래밍 언어에서 지원하는 XML Parser가 공개 되어 있으므로 사용 환경에 맞는 것을 사용하면 된다. 일반적으로 DOM, SAX를 지원하는 XML 파서를 사용하면 다른 언어에서도 기본적으로 비슷한 방법으로 XML 문서를 다루는 프로그램을 작성 할 수 있다.
참고로 DOM, SAX를 지원하는 Java Parser에는 Xerces라는 파서도 널리 이용되고 있다.
------------------------------------------------
예제
------------------------------------------------
DomSampleJava.xml
<?xml version="1.0" encoding="euc-kr" ?>
<cars>
<car>
<name>승용차</name>
<price>150</price>
</car>
<car>
<name>트럭</name>
<price>500</price>
</car>
</cars>
DomSampleJava.java
import java.io.*;
import javax.xml.parsers.*; //XML 파서를 다루기 위한것
import org.w3c.dom.*; //DOM
class DomSampleJava {
public static void main(String[] args) throws Exception{
//아래는 DOM을 준비하는 부분이다.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
// 문서를 읽음, JAXP RI에 DocumentBuilder의
//parse 메소드를 부른다.이 이후부터 문서를 객체화하여 doc라는 이름으로 접근 할 수 있다.
Document doc = db.parse(new FileInputStream("DomSampleJava.xml"));
//문서를 써낸다., 파서의 내장 클래스 라이브러리, //파일을 써낼때 이용
org.apache.crimson.tree.XmlDocument xdoc = (org.apache.crimson.tree.XmlDocument)doc;
BufferedWriter bw = new BufferedWriter(new FileWriter("result.xml"));
xdoc.write(bw, "euc-kr");
bw.close();
}
}
---------------------------------------------------------------
DOM 예제 (ASP 이용)
---------------------------------------------------------------
asptest.xml
<?xml version="1.0" encoding="euc-kr"?>
<도서>
<신청내역>
<신청인>홍길동</신청인>
<제목>OracleJava</제목>
<수량>2</수량>
<금액>14,000원</금액>
</신청내역>
<신청내역>
<신청인>이종철</신청인>
<제목>XML 5일완성</제목>
<수량>3</수량>
<금액>19,000원</금액>
</신청내역>
</도서>
asptest.asp
<%@ language=VBScript %>
<html>
<meta-equiv="Content-Type" content="text/html; charset=euc-kr" />
<head><title>asptest.asp</title></head>
<body>
<%
dim myDomObj, myRec, myHTML, i
'XML DOM 객체를 생성
set myDomObj = Server.CreateObject("Microsoft.XMLDOM")
myDomObj.async=false
'DOM 객체에 asptest.xml 파일을 로딩한다.
myDomObj.load Server.MapPath("asptest.xml")
//현재노드의 위치를 루트엘리먼트에 위치시킴
set myRec = myDomObj.documentElement
for i=0 to myRec.childNodes.Length-1
myHTML = myHTML & myRec.childNodes(i).text & "<hr>"
next
response.write myHTML
set myDomObj=nothing
%>
</body>
</html>
댓글 없음:
댓글 쓰기