수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694426
  • Today | 171
  • Yesterday | 606

Web/XML2006/03/15 22:41

XML을 저장하는 다양한 방법 - 2

박준호 (jhpark@k4m.com )

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 문서이다.






1

Hong Kil Dong

SALESMAN

1

1990-10-01

1300


다음은 사원 정보 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);
. . .
}
}
"XML" 카테고리의 다른 글
  • WSDL(Web Services Description Language) 1.1 (1)2007/01/10
  • 기본 XML Web Services (0)2007/01/10
  • XML을 저장하는 다양한 방법 - 3 (0)2006/03/15
  • XML을 저장하는 다양한 방법 - 2 (0)2006/03/15
  • XML을 저장하는 다양한 방법 - 1 (0)2006/03/15
2006/03/15 22:41 2006/03/15 22:41
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/1678

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 1502 1503 1504 1505 1506 1507 1508 1509 1510 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • upper_bound
  • Glide
  • ICMP
  • SETI@home
  • 파리
  • 인라인 값
  • SQL Injection
  • VisualStudio
  • 사이클로이드
  • Browsing
  • 사그라다 파밀리아
  • nested interrupt
  • 엔터티빈
  • 식당동
  • Garbage Collection
  • 모나리자
  • CPU 클럭
  • MIDI
  • 데이터 전처리
  • 심볼 링크

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.