본문 바로가기
PROGRAM/XML

[본문스크랩] [마소] XML을 저장하는 다양한 방법2

by 반화넬 2008. 1. 22.
반응형

참고: 마이크로소프트웨어 7월호

저 자 : 박준호 

 

XML 전용 저장장치를 이용하여 파싱된 형태로 저장하자


XML 전용 저장장치란 주로 객체 지향 데이터베이스 시스템 벤더들이 XML을 저장하기 위해 연구 개발한 상용XML 저장 엔진을 말한다. 최근 데이터베이스 시스템 벤더들 또한 XML 타입을 지원한다. 이 글에서 XML 전용 저장장치에 대한 정의를 XML 타입을 지원하고 XML 트리 형태의 구조를 저장하고 XML 트리 구조에 대한 검색이 가능한 시스템을 XML 전용 저장장치라 한다. XML 전용 저장장치의 주요 특색은 다음과 같다.

 

Store XML as parsed : 말뜻을 풀어보면 XML을 파싱하여 그 결과인 DOM(Document Object Model) 구조를 트리형태 그대로 저장하고 XML 문서의 구조를 다른 변환 과정 없이 직접 접근하여 빠른 속도로 XML로 복원 및 변경이 가능하도록 한다. 일반적인 관계형 데이터베이스의 저장 방식과는 차이가 있으며 트리 구조를 그대로 저장하는 기술로 주로 객체지향 데이터베이스 시스템 혹은 객체-관계형 데이터베이스 시스템 기반으로 구축된다.

 

XPath 혹은 XQL 기반의 질의 언어 제공 : 하나의 XML 문서의 구조는 DOM을 이용하여 그 내부 구조를 네비게이팅할 수 있겠지만 여러 개의 XML 문서에 대해서는 적합한 조건을 만족하는 XML 문서를 찾는다는 것은 모든 문서에 대해 DOM 네비게이션 방법으로는 불가능하다. XML 전용 저장장치는 XPath 혹은 XQuery 기반 혹은 이를 확장한 질의 언어를 제공한다. 이러한 질의 언어를 통해 트리 구조의 정보를 쉽고 빠르게 검색할 수 있다.

 

XML 관련 표준 기술들을 지원한다 : XML 전용 저장장치는 앞의 두 가지 기술을 주요 기술로 제공하며 그 외에 XML 관련 표준들 또한 지원한다. 그러한 기술로는 XSL, XSLT, SAX, SOAP 등이 있다.

 

 

파일 시스템에 XML을 저장하는 방법


이제 파일 시스템에 XML을 저장하는 방법에 대해 예제를 기반으로 살펴보자. <그림 1>은 파일 시스템을 이용하여 사원 및 부서 정보를 XML 파일들로부터 읽어 들이고 읽어 들인 정보를 메모리 상에 정보 모델(Information Model)로 맵핑한 후 정보 모델에 대해 일상적인 변경 및 검색 기능을 제공하는 파일 시스템 기반의 XML 저장 모델의 한 예를 도식화한 것이다.

 


<그림 1> 파일 시스템을 이용하여 XML을 정보 모델로 변환 및 복원하는 구조

 


<그림 1>의 XML 문서를 파일로부터 로딩하는 과정(<그림 1>의 ①단계), 정보 모델로부터 XML 파일로 다시 저장하는 과정(②), 정모 모델에서 해당 데이터를 생성(③), 데이터를 검색(④), 데이터를 변경(⑤)하는 방법을 바로 이어 각각 설명한다.

 

XML 문서를 로딩하는 방법


XML 문서를 읽어서 정보 모델로 변환하기 위해서는 XML 파서를 이용하여 파싱한 후 다양한 방법으로 구조를 파악하여 필요 정보를 생성해야 한다. XML을 파싱하여 구조를 파악하기 위한 방법으로는 크게 세 가지 방법이 있다.

 

ꊱ DOM API 사용
ꊲ SAX API 사용
ꊳ XPath API 사용

 

여기서는 세 가지 방법 중에서 사용법이 가장 쉬운 XPath API를 이용하여 XML 문서를 로딩하는 방법을 소개한다. XPath API를 사용하기 위해서는 아파치 소스 그룹에서 제공하는 XSLT 처리 모듈인 Xalan(http://xml.apache.org/ xalan-j/index.html)을 사용한다.

 

XPath API의 사용에 필요한 클래스


프로그래밍 언어로는 자바를 사용하며 Xalan을 사용하기 위해 다음과 같이 XML 파싱과 XPath API 관련 클래스들을 임포트해야 한다.

 

// XPath API를 사용하기 위해 필요로 하는 클래스들
// JAXP packages
import javax.xml.parsers.*;
// DOM packages
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
// XPath API
import org.apache.xpath.XPathAPI;
// IO & Util API
import java.io.*;
import java.util.*;

XPath API의 사용 방법


<리스트 1>은 XPath API를 이용하여 XPath 표현을 입력받아 해당하는 정보를 인출하는 세 가지 방법을 나타낸 것이다. XPath 표현법에 대해서는 W3C의 XPath 부분(http://www.w3c.org/TR/xpath)에서 자세히 설명한다. 다음은 <리스트 1>의 각 함수에 대한 설명이다.

 

◆ parse() : XML 정보를 가진 파일을 입력으로 받아 파싱하는 함수

 

◆ XPathSelectSingleNode() : 파싱된 이후의 DOM 구조의 특정 노드와 XPath를 입력으로 받아 XPath에 해당하는 하나의 노드만을 찾아서 그 값을 스트링으로 변환하여 리턴하는 함수

 

◆ XPathSelectNodeList() : DOM 구조의 특정 노드와 XPath를 입력으로 받아 XPath에 해당하는 모든 노드들의 리스트를 리턴하는 함수

 

◆ XPathSelectNodeListStr() : 앞의 세 번째의 노드 리스트의 값을 스트링 배열로 리턴하는 함수

 

<리스트 1> XPath API를 이용한 함수들


public class XMLUtil {
public static Document parse(File file) throws Exception{
// Step 1: DocumentBuilderFactory를 and configure it
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
db = dbf.newDocumentBuilder();

// Step 2: parse the input file
Document doc = db.parse(file);
return doc;
}

public static String XPathSelectSingleNode(Node node, String exp)
throws Exception {
Node resultnode = XPathAPI.selectSingleNode(node, exp);
if(resultnode != null) return resultnode.getNodeValue();
else return null;
}

public static NodeList XPathSelectNodeList(Node node, String exp)
throws Exception {
return XPathAPI.selectNodeList(node,exp);
}

public static String[] XPathSelectNodeListStr(Node node, String exp)
throws Exception {
NodeList nl = XPathAPI.selectNodeList(node, exp);
String result[] = null;
if(nl != null) result = new String[nl.getLength()];
for(int i=0;i result[i] = nl.item(i).getNodeValue();
}
return result;
}
. . .
}

 

XPath API를 이용하여 Employee.xml 파일로부터 정보를 생성하는 방법
다음은 사원의 정보를 표현한 간단한 XML 문서이다.


<?xml version="1.0"?>

<Employee>

<EmpNo>1</EmpNo>

<EName>Hong Kil Dong</EName>

<Job>SALESMAN</Job>

<Mgr>1</Mgr>

<HireDate>1990-10-01</HireDate>

<SAL>1300</SAL>

</Employee>


다음은 사원 정보 XML 문서에 대해 XPath를 적용하여 Employee 자바 객체를 생성하는 방법을 나타낸다. XML 내의 사원 정보의 각 구성 필드와 생성할 Employee 자바 클래스의 필드가 1:1로 맵핑되므로 XPathAPI.selectSingleNode() 함수를 이용한다.

 

public class Employee {
// members
public String EmpNo;
public String EName;
public String Job;
public String Mgr;
public String HireDate;
public String SAL;

// Employee 노드를 입력으로 받아 하위 자식 노드의 값을 XPath로 찾은 후
// Employee의 구성 멤버의 값을 초기화한다.
public Employee(Node node) throws Exception{
EmpNo=XPathAPI.selectSingleNode(node,"EmpNo/text()").getNodeValue();
EName=XPathAPI.selectSingleNode(node,"EName/text()").getNodeValue();
Job=XPathAPI.selectSingleNode(node,"Job/text()").getNodeValue();
Mgr=XPathAPI.selectSingleNode(node,"Mgr/text()").getNodeValue();
HireDate=XPathAPI.selectSingleNode(node,"HireDate/text()").getNodeValue();
SAL=XPathAPI.selectSingleNode(node,"SAL/text()").getNodeValue();
}

public static void main(String args[]) throws Exception {
Document document = XMLUtil.parse(new File("Employee.xml"));
Node node = XPathAPI.selectSingleNode(document,"Employee");
Employee emp = new Employee(node);
. . .
}
 

반응형