XML의 이해

Similar documents
PowerPoint 프레젠테이션

인디쓔피-IOM핸돜벁닄큐1014pdf, page Preflight ( IOM핸돜벁닄큐__1014 )

한국학 온라인 디지털 자원 소개

XML04

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

untitled

API 매뉴얼

마리오와 소닉 리우 올림픽™

BSC Discussion 1

snmpgw1217

Copyrights and Trademarks Autodesk SketchBook Mobile (2.0.2) 2013 Autodesk, Inc. All Rights Reserved. Except as otherwise permitted by Autodesk, Inc.,

한국학 온라인 디지털 자원 소개

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

강의 개요

피해자식별PDF용 0502

C# Programming Guide - Types

chap 5: Trees

API 매뉴얼

CONTENTS

PowerPoint 프레젠테이션

HTML5가 웹 환경에 미치는 영향 고 있어 웹 플랫폼 환경과는 차이가 있다. HTML5는 기존 HTML 기반 웹 브라우저와의 호환성을 유지하면서도, 구조적인 마크업(mark-up) 및 편리한 웹 폼(web form) 기능을 제공하고, 리치웹 애플리케이 션(RIA)을

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

thesis

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

PowerPoint 프레젠테이션

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint Presentation

ISP and CodeVisionAVR C Compiler.hwp

Tcl의 문법

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

MySQL-.. 1

Microsoft Word _whitepaper_latency_throughput_v1.0.1_for_

step 1-1

歯튜토리얼-이헌중.PDF

Web Scraper in 30 Minutes 강철

Microsoft PowerPoint - 26.pptx

untitled

Copyright by Korean Local-government Management Institute. ALL RIGHTS RESERVED. No part of this publication may be reproduced, stored in a retrieval s

V28.

Microsoft PowerPoint - chap03-변수와데이터형.pptx

PowerPoint Template

adfasdfasfdasfasfadf

자연언어처리

Javascript

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft Word - Armjtag_문서1.doc

Microsoft PowerPoint - MonthlyInsighT-2018_9월%20v1[1]

HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 :

C++ Programming

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

View Licenses and Services (customer)

슬라이드 1

DocsPin_Korean.pages

양파 공동체 中 이제 들여보내 다오. 나는 쪼개지고 부서지고 얇아지는 양파를 쥐고 기도했다. 도착하면 뒷문을 열어야지. 뒷문을 열면 비탈진 숲, 숲을 지나면 시냇물, 굴러 떨어진 양파는 첨벙첨벙 건너갈 것이다. 그러면 나는 사라질 수 있겠다. 나는 때때로 양파에 입을

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Database Search 편 * Database Explorer 8개의카테고리로구성되어있으며, 데이터베이스의폴더역할을하는 subset ( 혹은 subbase) 을생성하여데이터를조직및관리하게된다. 클릭! DNA/RNA Molecules : feature map의데이터

미쓰리 파워포인트

2학년 1학기 1,2단원 1 차례 세 자리의 수 1-1 왜 몇 백을 배워야 하나요? 1-2 세 자리 수의 자릿값 알아보기와 크기 비교하기 1-3 뛰어 세기와 수 배열표에서 규칙 찾기 1단원 기본 평가 단원 창의 서술 논술형 평가 22 1단원 심화 수

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Index Process Specification Data Dictionary

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

PowerPoint Presentation

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

KNK_C_05_Pointers_Arrays_structures_summary_v02

기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라.

정보기술응용학회 발표

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

2009방송통신산업동향.hwp


User Guide

OCW_C언어 기초

PowerPoint 프레젠테이션

00-CourseSyllabus

이 설명서의 올바른 참고문헌 인용은 다음과 같습니다. SAS Institute Inc SAS University Edition: Amazon Web Services 용 설치 가이드 Cary, NC: SAS Institute Inc. SAS Universit

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - additional01.ppt [호환 모드]

pdf

서현수

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

4S 1차년도 평가 발표자료

BTSK

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint 웹 연동 기술.pptx

웹 프로그래밍

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Microsoft PowerPoint - chap06-2pointer.ppt

Windows Server 2012

Product A4

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

수식모드수식의표현법 수학식표현 조남운 조남운 수학식표현

Microsoft PowerPoint - CSharp-10-예외처리

토익S-채용사례리플렛0404

APOGEE Insight_KR_Base_3P11

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Transcription:

Technical Notes / www.novonetworks.com Classification: XML XML 의이해 Understanding of XML Release 1.0 2010/10

Copyright 2010 novo networks. All rights reserved. All information contained herein is the property of novo networks. No part of this publication (whether in hardcopy or electronic form) may be reproduced or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of novo networks. No responsibility is assumed by novo networks for the use thereof nor for the rights of third parties which may be effected in any way by the use thereof. Any representation(s) in this document concerning performance of novo networks product(s) are for informational purposes only and are not warranties of future performance All other trademarks, service marks, registered trademarks, or registered service marks may be the property of their respective owners. All specifications are subject to change without prior notice. 2

목차 (Table of Contents) 1. AUDIENCE... 4 2. XML 문법 시작하기... 5 2.1 TAG, CONTENT, ELEMENT... 5 2.2 NESTED ELEMENT... 7 2.3 CONTENT 의종류... 9 2.4 XML IS TREE... 10 2.5 ATTRIBUTE... 12 3. XML 문서검색하기... 14 3.1 XPATH... 14 3.2 E4X... 16 4. XML 문법 좀더깊게... 17 4.1 ESCAPING CHARACTER, CDATA, COMMENT... 17 4.2 XML DECLARATION... 20 4.3 NAMESPACE... 21 5. XML SCHEMA LANGUAGE... 24 5.1 DTD... 25 5.2 XML SCHEMA DEFINITION(XSD)... 28 5.3 RELAX NG... 32 6. XML API... 34 6.1 DOM... 34 6.2 SAX... 35 APPENDIX A. 문서정보... 37 A.1 문서이력... 37 APPENDIX B. REFERENCES... 38 3

1. Audience 이문서는 XML(Extensible Markup Language) 를처음접하는사람을위해작성되었으며, XML 문법과 XML 문서내용에접근하는방식등기초적이고일반적인내용을담고있습니다. 추가적으로 XML 라이브러리사용법이나 XML 문서를 display 하는방법 (XSL, CSS 와같은 ) 등이궁금하신분들께서는 reference 의문서나기타다른문서를참고하시길바랍니다. 4

2. XML 문법 시작하기 Valid XML document XML 문법에대해설명하기전에 'well-formed XML 문서 ' 에대해정의할필요가있습니다. well-formed XML 문서란 W3C 라는단체에서 1998 년에제정한 XML 1.0 권고안을따르는 XML 문서를말합니다. 2004 년에최신버전인 1.1 버전이배포되었는데, 두버전은큰차이가없으므로여기서는좀더널리쓰이는 XML 1.0 버전을기준으로삼겠습니다. 통상적으로 'XML 문서 ' 라고하면앞에 'well-formed' 가생략되었다고간주됩니다. well-formed XML 문서를작성하기위한규칙을만든이유는 XML 문서를읽어서쉽게 markup 데이터를구별해낼수있는프로그램을만들기위해서입니다. 이렇게 XML 문법을이해할수있고, XML 문서를읽어어플리케이션이필요로하는정보를제공하는 component 를 XML parser 라고합니다. XML 1.0 규격을따르는 XML parser 가 well-formed XML 이아닌문서를받아들이면에러를표시합니다. 다음절부터는 XML 문서를작성하는과정을통해 XML 1.0 에서정의하는문법규칙을살펴보도록하겠습니다. 2.1 Tag, content, element 게임을좋아하는친구와함께여러가지게임에관한정보를종합하는웹페이지를만들려고합니다. 친구와상의한결과우선게임에관한정보를모아 XML 문서로만들어놓으면좋겠다는결론을내렸습니다. 주제가정해졌으니, 이제첫번째 XML 문서를작성해봅시다. 부등호기호 (<>) 로둘러싸여있는글자들을 tag( 태그 ) 라고합니다. '' 는여는태그, '' 는닫는태그라고부릅니다. 한쌍의여는태그와닫는태그는슬래시 ('/') 가있는지없는지를제외하면모양 ( 대 소문자포함 ) 이같아야합니다. 여기에내용을좀더추가하면다음과같습니다. 5

StarCraft 태그사이에 'StarCraft' 라는데이터를적어넣었습니다. 태그사이에적힌데이터를 content( 내용 ) 라고합니다. 이 content 가 XML 을통해저장할실제데이터입니다. 그렇다면태그안에적혀있는 'games' 는무슨의미일까요? 이것은 content 가무엇에관한데이터인지를알려주는역할을합니다. 따라서위의 XML 문서를보고 'StarCraft 는 game 이구나 ' 라고추측할수있습니다. 이렇게 XML 문서는한쌍의태그가 content 를둘러싸고있고, 태그는그 content 에관한정보를제공하는구조를가지고있습니다. 한쌍의태그와그태그안의 content 를모두통틀어 element( 요소 ) 라고부릅니다. 즉 'StarCraft' 가전부 element 인것입니다. 태그안의글자인 'games' 는 element 의이름이라고볼수있습니다. 보통 'StarCraft' 라는 element 를가리켜 'games element' 라고부릅니다. element 이름은숫자나구두점, 혹은 'xml' 이라는문자열 ( 대소문자상관없이 ) 로시작하면안되고, 공백이없어야한다는것을제외하면마음대로지을수있습니다. <game>starcraft</game>, <product>starcraft</product> 는물론심지어 < 게임 > 스타크래프트 </ 게임 > 과같이한글로도쓸수있습니다. 이러한자유로움은 XML 을 'Extensible' 하게만들어주는특성중하나입니다. 6

2.2 Nested element StarCraft 위문서는간단해보이긴하지만, 너무간단해서별쓸모가없어보입니다. 이제 좀더쓸만한 XML 문서가되도록확장해봅시다. 게임중에서도비디오게임에 관한데이터를쓰려고합니다. 어떻게해야할까요? <video_game> 위와같이, element 의 content 자리에또다른 element 를집어넣을수있습니다. 이렇게 element 안에 element 가들어있는구조를가리켜 nested element( 중첩된요소 ) 라고합니다. element 를중첩시킬수있다는점은 XML 을강력하게만들어주는특성입니다. 이번에는비디오게임의이름을추가해봅시다. <video_game><title></title> title element 를 video_game element 안에추가하였습니다. 그런데문서가점점길어 질수록읽기도점점힘들어집니다. 위문서를좀더읽기쉽게바꾸어봅시다. <video_game> <title></title> indent( 들여쓰기 ) 를적용하였습니다. 한결알아보기가쉬워보입니다. 계속해서 title element 에내용을채워봅시다. <video_game> <title>starcraft</title> 7

게임의이름은 StarCraft 로군요. 이게임의개발사에관한정보도추가하려면어 디에추가해야할까요? <video_game> <title>starcraft</title> <developer></developer> video_game element 안, title element 바로다음에개발사에관한정보를추가하였습니다. 이렇게한 element 안에는여러개의 element 가중첩되어있을수있습니다. element 의중첩에는아무런제한이없으므로원하는대로데이터를가공할수있습니다. <video_game> <title>starcraft</title> <developer>blizzard Entertainment</developer> 개발사의이름도적어보았습니다. 이제이 XML 문서는게임중에서 Blizzard Entertainment 에서개발한 StarCraft 라는이름의비디오게임에관한데이터를뜻하게되었습니다. 8

2.3 Content 의종류 content 의종류로는 element content, simple content, mixed content 세가지가있습니다. XML 문서를통해각각의뜻을살펴봅시다. <video_game> <title>starcraft</title> <developer>blizzard Entertainment</developer> StarCraft has a professional competition. 이전절의마지막문서에굵은글씨의데이터 (StarCraft 라는게임에관한특기사 항 ) 를추가한문서입니다. games element 는 content 로 video_game 이라는 element 만을가지고있습니다. content 자리에 element 만있을경우 (element 의개수는상관없음 ) 이를 element content 라고합니다. title element 와 developer element 는 content 로평범한 text 만을가지고있습니다. 이 것을 simple content( 혹은 text content) 라고합니다. 그렇다면 video_game element 는어떨까요? video_game element 는 content 로 title element, developer element 와함께 "StarCraft has a professional competition." 라는내용의 text 도가지고있습니다. 이렇게 content 자리에 element 와 text 가둘다있는것을가리켜 mixed content 라합니다. 9

2.4 XML is Tree 이전절의문서에다른종류의비디오게임에관한정보를추가하려합니다. <video_game> <title>starcraft</title> <developer>blizzard Entertainment</developer> StarCraft has a professional competition. <video_game> games element 안에 video_game 이라는이름의 element 를하나더추가하였습니다. 참고로 <video_game> 과같이 content 자리에아무것도없는 element 를가리켜 empty( 빈 ) element 라고부르는데, <video_game/> 이라고축약하여쓸수도있습니다. 두번째 video_game element 안에도첫번째 video_game element 와같이 title 과 developer element 를추가하여줍시다. <video_game> <title>starcraft</title> <developer>blizzard Entertainment</developer> StarCraft has a professional competition. <video_game> <title>call of Duty</title> <developer>infinity Ward</developer> 새 element 들을추가하면서, XML 이 tree 구조를가지고있다는것을눈치채신분 이있으실것같군요. 위의예제를 tree 로표현하면다음과같습니다. 10

<name> StarCraft <video_game> <developer> Blizzard Entertainment StarCraft has a professional competition. <name> Call of Duty <video_game> <developer> Infinity Ward XML 이 tree 구조를가지고있다는것은큰장점입니다. table 형태의데이터만저장할수있는 database 에비해 XML 은좀더다양한구조의데이터들을저장할수있습니다. 다음은 XML 의 tree 구조를나타내기위한몇가지용어에대한설명입니다. tree 가하나의 root node 를갖듯이, XML 문서는반드시단하나의 root element( 최 상위요소 ) 를가져야합니다. 위의 XML 문서의 root element 는 games element 입니 다. element 와그 element 의 content 사이의관계를부모-자식관계라고합니다. element 는 content 의 parent( 부모 ) 라고하고, content 는 element 의 child( 자식 ) 라고합니다. 위의 XML 문서에서 games element 는 video_game element 의 parent 이고, title element 는 video_game element 의 child 입니다. root element 는 parent 가없는 element 라고도할수있습니다. parent 의 parent, parent 의 parent 의 parent 와같은관계를 ancestor( 조상 ) 라고하고, child 의 child, child 의 child 의 child 와같은관계를 descendant( 자손 ) 라고합니다. games element 는 developer element 의 ancestor 이고, developer element 는 games element 의 descendant 입니다. parent 가같은 content 끼리의관계를 sibling( 형제 ) 이라합니다. 첫번째 video_game element 와두번째 video_game element 는서로 sibling 관계입니다. 11

2.5 Attribute element 에 content 를추가하는것말고도, XML 문서에데이터를추가하는방법이 한가지가더있습니다. 바로 attribute( 속성 ) 입니다. attribute 를이용해서이전절의 문서에게임이발매된연도에관한정보를추가할수있습니다. <video_game release="1998"> <title>starcraft</title> <developer>blizzard Entertainment</developer> <video_game> <title>call of Duty</title> <developer>infinity Ward</developer> 굵게표시된글자가새로작성된 attribute 입니다. attribute 는 element 의여는태그이름옆에 attribute_name="value" 와같은형태로적히며, 태그의이름과 attribute 는공백으로구분됩니다. attribute 는그 attribute 가적혀있는 element 에관한데이터를뜻하게됩니다. 위의문서는 " 첫번째 video_game element 에는 release 라는속성이있는데, 그값은 1998 이다 " 와같은의미를가집니다. 한 element 는여러개의 attribute 를가질수도있습니다. 이번에는게임의장르에 관한정보를추가해봅시다. <video_game release="1998" genre='real-time strategy'> <title>starcraft</title> <developer>blizzard Entertainment</developer> <video_game> <title>call of Duty</title> <developer>infinity Ward</developer> 12

여러개의 attribute 는공백을이용하여서로구분됩니다. 위의문서에서와같이큰따옴표 (" ") 외에작은따옴표 (' ') 도쓸수있습니다. 한가지주의할점은한 element 안에는같은이름을가진 attribute 가여러개있어서는안된다는것입니다. 이제두번째 video_game element 에도 attribute 를추가해봅시다. <video_game release="1998" genre="real-time strategy"> <title>starcraft</title> <developer>blizzard Entertainment</developer> <video_game release="2003" genre="first Person Shooter"> <title>call of Duty</title> <developer>infinity Ward</developer> 두번째비디오게임의발매연도는 2003 년이고, 장르는 1 인칭슈팅게임이라는 것을알수있습니다. 13

3. XML 문서검색하기 여태까지는새로운 XML 문서를작성하는데에만집중하였으니, 이제관심을이미존재하는 XML 문서를다루는쪽으로돌려봅시다. 친구가게임에관한데이터를모두정리한 XML 문서를건네주었습니다. 그문서에서개발사가 Blizzard Entertainment 인게임들의이름을얻어내고싶습니다. 그런데문서가이전장에서본것처럼몇줄안된다면한눈에봐도이름을찾을수있겠지만, 만약문서가수백, 수천줄이라면어떨까요? 어떻게그많은내용중내가알고싶은데이터만뽑아낼수있을까요? 이번장에서는 XML 문서를 ' 검색 ' 할수있게해주는두가지방법에대해서알아보고자합니다. 3.1 XPath XPath 는 XML Path Language 의약자로, XML 문서에서특정한부분을선택하는 언어입니다. W3C 에서 1999 년에 1.0 버전을배포하였고 2007 년에 2.0 버전을배 포하였는데, 여기서는좀더널리쓰이는 1.0 버전을기준으로설명하겠습니다. XPath 는절대적경로와상대적경로, 축약되지않은문법과축약된문법을제공 하는데, 지금은절대적경로와축약된문법에대해서만알아보도록하겠습니다. 자세한내용이궁금하신분은 reference 의문서들을보시기바랍니다. <video_game release="1998" genre='real-time strategy'> <title>starcraft</title> <developer>blizzard Entertainment</developer> <video_game release="2003" genre="first Person Shooter"> <title>call of Duty</title> <developer>infinity Ward</developer> 위의문서는이전장에서보았던문서입니다. 이제이문서에서원하는정보를얻기위해어떠한표현을써야하는지에대해알아봅시다. 14

모든비디오게임에관한정보를찾고싶어요! 비디오게임에관한정보를얻으려면 video_game element 를찾아야합니다. video_game element 는 games element 의자식이므로, /games/video_game 이라는표현으로문서를검색할수있습니다. slash(/) 의왼쪽은 parent element, 오른쪽은 child element 를뜻합니다. games element 의왼쪽에는아무것도없으므로 root element 임을알수있습니다. 문서에는 video_game element 가두개이므로, 검색결과가두개나오겠군요. 문서전체에서게임의이름들만찾고싶어요! 게임의이름은 title element 가가지고있습니다. 특정 element 의자식이아니라문서전체에서찾으려하므로, //title 이라는표현을쓸수있습니다. '//' 는오른쪽 element 가왼쪽 element 의 descendant 임을뜻합니다. 여기서는왼쪽에아무것도없으니 root element 부터모든 descendant 를검색하겠다는뜻입니다. 두번째비디오게임에대한정보를찾고싶어요! 문서를보니 video_game element 가두개있군요. 이렇게같은이름을가진 sibling element 가여러개있을경우, 위에서부터순서대로 index 를붙여검색할수있습니다. 이때의 index 는 1 부터시작합니다. 따라서 /games/video_game[2] 라고검색하면원하는결과를얻을수있습니다. 첫번째비디오게임의발매연도를알고싶어요! 발매연도는 release 라는이름의 attribute 로저장되어있습니다. attribute 를검색할때는이름앞에 '@' 를붙여주면됩니다. /games/video_game[1]/@release 라고검색하면원하는결과를얻을수있습니다. 두번째비디오게임의이름과개발사를알고싶어요! 비디오게임의이름과개발사정보는각각 title 과 developer element 가가지고있습니다. 두 element 를각각검색해도되지만, 한꺼번에검색하는방법도있습니다. /games/video_game[2]/* 라고검색하면, 두번째 video_game element 의모든 child element 를찾아줍니다. 여기서 '*'(asterisk) 는 'all' 을뜻합니다. 살짝응용해서 /games/video_game[2]/@* 라고검색하면, 두번째 video_game element 의모든 attribute 를찾아줄것입니다. 개발사가 Blizzard Entertainment 인게임의이름을알고싶어요! 일단 "Blizzard Entertainment" 라는내용을가진 developer element 를 child 로가지는 15

video_game element 를찾아야합니다. 그리고찾는것이 ' 게임의이름 ' 이니그 video_game element 의 child 중 title element 를찾아야합니다. 이를 XPath 표현으로나타내면 /games/video_game[developer="blizzard Entertainment"]/title 이라고할수있습니다. 이와같이각괄호 ([]) 안에조건식을넣을수있습니다. 3.2 E4X E4X(ECMAScript for XML) 는 ActionScript 등의언어에서쓸수있는확장언어로, XML 을 int 나 char 같은 primitive type 으로취급하여 XML 을쉽게다룰수있게해줍니다. XML 문서를추가, 수정, 편집하는등다양한기능을갖고있지만여기서는 E4X 의검색기능에대해서만간략하게소개하도록하겠습니다. 아래표는이전절에서소개한 XPath expression 과동일한기능을하는 E4X expression 을나타냅니다. XPath expression /games/video_game //title /games/video_game[2] /games/video_game[1]/@release /games/video_game[2]/* /games/video_game[developer="blizzard Entertainment"]/title E4X expression games.video_game games..title games.video_game[1] games.video_game[0].@release games.video_game[1].* games.video_game.(developer=="blizzard Entertainment").title E4X 에대해자세한내용이궁금하신분들은 reference 의문서나기타다른문서 들을참고하시기바랍니다. 16

4. XML 문법 좀더깊게 2 장에서소개한기초 XML 문법만알아도 XML 문서를이해하고사용하는데큰어려움은없지만, 특수한경우를처리하거나부가적인정보를추가하기위해몇가지더알아야할문법들이존재합니다. 이번장은그러한문법들에대해다루고있습니다. 4.1 Escaping character, CDATA, Comment 여태까지봐왔던 games 문서에 'Command & Conquer' 라는이름을가진게임에관 한정보를넣으려합니다. 이제여러분들은다음과같이 XML 문서를작성할수 있을것입니다. <video_game release="1995" genre="real-time strategy"> <title>command & Conquer</title> <developer>westwood Studios</developer> 그러나애석하게도위문서에는한가지문제가존재합니다. XML 에서 ampersand('&') 문자는특수한용도를위해예약되어있는기호이기때문에 content 자리에그냥써서는안되기때문입니다. 이렇게예약되어있는기호를 content 자리에쓰기위해 escaping character 라는것이존재합니다. 다음은 XML 에서예약되어있는기호들과 escaping character 들입니다. 기호 & (ampersand) Escaping character & < (less-than sign) < > (greater-than sign) > ' (apostrophe) &apos; " (double quotation mark) " 17

escaping character 를이용하여위의문서를바르게고치면다음과같습니다. <video_game release="1995" genre="real-time strategy"> <title>command & Conquer</title> <developer>westwood Studios</developer> XML parser 는 content 를읽어가다가 '&' 나 '<' 같은예약어를만나면그다음에나오는문자는 content 가아닌다른문자라고해석합니다. 그래서 simple content 를 'Parsed Character DATA', 줄여서 PCDATA 라고부릅니다. parser 가 content 를일일이해석하지않고문자그대로받아들이게하기위해 CDATA(Character DATA) section 이라는것을사용할수있습니다. <video_game release="1995" genre="real-time strategy"> <title><![cdata[command & Conquer]]></title> <developer>westwood Studios</developer> 이전문서를 CDATA section 을사용하여고친것입니다. 굵게표시한부분이 CDATA section 인데, "<!CDATA[" 로시작하여 "]]>" 로끝납니다. XML parser 는 CDATA section 안에있는글자를해석하지않고그냥문자그대로받아들입니다. 따라서 CDATA section 안에예약어를그대로적을수있습니다. escaping character 를너무많이써야할경우에유용합니다. XML 문서에주석을적는것도가능합니다. 다음은위의문서에주석을추가한 것입니다. 18

<video_game release="1995" genre="real-time strategy"> <!-- Date of modifying: 2010/10/4 --> <title><![cdata[command & Conquer]]></title> <developer>westwood Studios</developer> 굵은글씨가주석문입니다. 주석은 "<!--" 로시작해서 "-->" 로끝납니다. 태그안에주석을쓸수는없으며, 주석의내용안에 "--" 문자열이존재해서는안됩니다. 19

4.2 XML Declaration 친구로부터건네받은 XML 문서를 XML parser 에입력하여 parsing 해보고자합니다. 이때 XML parser 는 XML 문서자체에대한몇가지정보를알아야할필요가있습니다. 이때쓰이는것이 XML declaration 입니다. 다음은이전절의문서에 XML declaration 을추가한것입니다. 제일윗줄이 XML declaration 의한예입니다. <?xml version='1.0' encoding='utf-8' standalone='yes'?> <video_game release="1995" genre="real-time strategy"> <title>command & Conquer</title> <developer>westwood Studios</developer> XML declaration 을작성하는규칙은다음과같습니다. "<?xml" 로시작해서 "?>" 로끝나야합니다. version 속성은필수이지만 encoding 과 standalone 속성은안써도됩니다. 속성은반드시 version, encoding, standalone 의순서대로쓰여야합니다. XML declaration 은반드시 XML 문서의가장첫부분에쓰여야합니다. 이제 XML declaration 의세가지속성이무엇을뜻하는지살펴보겠습니다. 먼저 version 속성은 XML 권고안의버전을뜻합니다. version 속성의값이 1.1 인문서를 XML 1.0 parser 가읽어들이면 parser 는에러를표시합니다. encoding 속성은 XML parser 가 XML 문서를읽을때어떠한 encoding 을사용할 것인가에관한속성입니다. encoding 속성을작성하지않으면 XML parser 는문서 를기본적으로 UTF-8 이나 UTF-16 으로 encoding 하게됩니다. standalone 속성은해당 XML 문서가다른파일에있는 element 나그림, 개체등을참조하고있는지아닌지를나타냅니다. 이속성의값은반드시 "yes", "no" 둘중하나여야합니다. 값이 "yes" 라면문서가외부파일에의존하고있지않다는것을의미하고, "no" 라면외부파일에의존하고있음을의미합니다. 20

4.3 Namespace 여태까지의 XML 문서에서는비디오게임에관한데이터만다루었는데, 이번에는 아케이드게임에관한데이터를추가하려고합니다. 다음은 'Arkanoid' 라는이름 의아케이드게임에대한데이터를추가한 XML 문서입니다. <video_game release="1998" genre="real-time strategy"> <title>starcraft</title> <developer>blizzard Entertainment</developer> <arcade_game release="1986" genre="breakout clone"> <title>arkanoid</title> <developer>taito</developer> </arcade_game> 여러분은이문서를친구에게주었고, 친구는이문서에서게임의이름에대한정보만얻으려한다고가정해봅시다. 문서전체에서 'title' 이라는이름을가진 element 를검색하면 <title>starcraft</title>, <title>arkanoid</title> 라는두개의결과를얻을수있을것입니다. 그런데어떤것이비디오게임의이름이고, 어떤것이아케이드게임의이름인지어떻게알수있을까요? 불행히도위의문서에서는두 title element 를서로구분할수없습니다. element 의이름을작성자가마음대로지을수있다는것은 XML 의장점중하나이지만, 그때문에위와같이 element 이름은같지만그의미가다른경우가발생하기도합니다. 이러한문제를해결하기위한것이바로 XML Namespace 입니다. 다음은 XML namespace 를이용하여비디오게임과아케이드게임을서로구별할 수있게작성한 XML 문서입니다. 21

<games xmlns:video="http://en.wikipedia.org/wiki/video_game" xmlns:arcade="http://en.wikipedia.org/wiki/arcade_game"> <video:video_game video:release="1998" video:genre="real-time strategy"> <video:title>starcraft</video:title> <video:developer>blizzard Entertainment</video:developer> </video:video_game> <arcade:arcade_game arcade:release="1986" arcade:genre="breakout clone"> <arcade:title>arkanoid</arcade:title> <arcade:developer>taito</arcade:developer> < arcade:arcade_game> element 와 attribute 이름앞에 'video' 와 'arcade' 라는접두사 (prefix) 를각각붙여두었습니다. 접두사와이름사이에는 colon(':') 을적어서로구분합니다. ' 접두사를이용하여 element 를서로구분한다는것까지는알겠는데, games element 의 attribute 자리에적혀있는 xmlns:video="http://en.wikipedia.org/wiki/video_game" 같은건대체뭐지?' 라는의문이들수있습니다. 바로이부분이 namespace 에서가장중요한부분입니다. element 들을서로구분하기위해접두사를사용하였는데, 그접두사마저똑같다면어떻게될까요? 이런경우를방지하기위해접두사로이미존재하는고유한인터넷주소인 URL(Uniform Resource Locator) 을사용할수있습니다. 그런데 URL 은그대로접두사로사용하기에는너무길고번거로우므로, xmlns attribute 를이용하여글자수를줄이는것입니다. xmlns:video="http://en.wikipedia.org/wiki/video_game" 은 ' 지금부터 namespace 접두사로 video 라는것을쓸것인데, 사실 video 는 http://en.wikipedia.org/wiki/video_game 과같은뜻이다 ' 라는의미를가집니다. 마치 C 언어의 typedef 문과같은역할을합니다. 이렇게선언된 namespace 접두사들은접두사가선언된 element 와그 element 의 descendant 들에서만쓸수있습니다. namespace 는어떤 element 가어떤그룹에속해있는지를알려주는것이외의의미 를가지지않습니다. <arcade:title> 이라는표현은그 element 의이름이 arcade:title 이라는것을뜻하는것이아니라, title 이라는이름을가진 element 가 arcade 라는 22

그룹에포함되어있다는것을의미합니다. 이것은 C:\Users 에있는 myfile.txt 와 C:\Program Files 에있는 myfile.txt 는같은이름을가졌지만전혀다른파일이라는 것과비슷한개념입니다. 구분을위해접두사를쓰는것까지는좋은데, 문서가약간지저분해보일수있 습니다. 이런경우에 default namespace 를사용할수있습니다 <video_game release="1998" genre="real-time strategy" xmlns="http://en.wikipedia.org/wiki/video_game"> <title>starcraft</title> <developer>blizzard Entertainment</developer> <arcade_game release="1986" genre="breakout clone" xmlns="http://en.wikipedia.org/wiki/arcade_game"> <title>arkanoid</title> <developer>taito</developer> <arcade_game> xmlns attribute 뒤에아무접두사도적지않으면해당 namespace 는그것이선언된 element 와그 element 의모든 descendant 들의기본 namespace 로인식됩니다. 위의 문서는직전의문서와같은의미를가진다고볼수있습니다. 그런데 " 이름이같은 element 를구분하기위해 namespace 를도입했는데, default namespace 를써서접두사를없애면결국 element 의이름은여전히같은것아닌가?" 하는의문이들수있습니다. 실제로 XPath 는 default namespace 를제대로처리하지못합니다. 그러므로 namespace 를본래의의미에충실하게사용하려면 default namespace 를사용하지않는것이좋습니다. 대신에 default namespace 는 XML Schema Definition(XSD) 등의응용기술을위한 XML 문서에서유용하게쓰입니다. 5.2 절의 XML Schema Definition(XSD) 설명에서 default namespace 의쓰임새를볼수있습니다. 23

5. XML Schema Language Valid XML document 2 장과 4 장에서는 XML 문법에대해알아보았습니다. 이제우리는어떤 XML 문서가 XML 문법에맞는지컴퓨터를이용해판별할수있습니다. 그렇다면그 XML 문서가무엇에관한데이터를뜻하는지에대해서도컴퓨터가알아낼수있을까요? 사람은태그의이름과내용을보고 XML 문서가무엇에관한것인지짐작할수있지만, 컴퓨터가그렇게하기는쉽지않습니다. 그대신에컴퓨터는 XML schema language 라는것을사용합니다. XML schema language 는 XML 문서가어떤구조로되어있는지, element 는몇개를가지고있는지, element 의이름은무엇인지, element 의 attribute 와 content 로는어떤것이들어가야하는지등을규정하는데에쓰입니다. XML schema 를이용하여어떤 XML 문서를검사한결과규정된구조에맞게되어있다고판별되면그문서를 valid ( 유효한 ) XML 문서라고부릅니다. 이장에서는가장많이쓰이는 XML schema language 세가지에대해서예제를통 해간략하게소개하도록하겠습니다. 자세한내용이궁금하시면 reference 문서들 을참고하시기바랍니다. 24

5.1 DTD DTD 는 Document Type Definition 의약자로, W3C 에서발표한 XML 1.0 버전권고 안에포함되어있는 XML schema language 입니다. <video_game release="1998" genre='real-time strategy'> <title>starcraft</title> <developer>blizzard Entertainment</developer> <video_game release="2003" genre="first Person Shooter"> <title>call of Duty</title> <developer>infinity Ward</developer> 위의 XML 문서를 'valid' 하다고판별하는 DTD 문서를작성하면서 DTD 문법에 대해알아봅시다. <!DOCTYPE games []> 가장먼저적어야할것은 DOCTYPE 선언입니다. 위의 DOCTYPE 선언은 root element 의이름이 games 인 XML 문서에대한 DTD 를작성한다는의미를가집니다. 이후에적을모든 DTD 내용은 DOCTYPE 선언의대괄호 ('[]') 안에들어가게됩니다. 이제첫번째로 root element 인 games element 를정의하는문장을적어봅시다. XML 문서에서 games element 는두개의 video_game element 를가지고있습니다. 애석하게도 DTD 는이름이같은 element 의개수를지정하는문법을가지고있지않으므로, games element 는 0 개이상의 video_game element 를가질수있다고가정합시다. 다음은이를 DTD 로표현한것입니다. <!DOCTYPE games [ ]> <!ELEMENT games (video_game)*> 25

element 정의는 <!ELEMENT element_name (content)> 와같은형태로적습니다. '*'(asterisk) 는그앞의내용이 0 번혹은그이상반복될수있음을뜻합니다. 이제 video_game element 가어떤모양을가져야하는지정의해봅시다. video_game element 는 content 로 title 과 developer element 를가지고있습니다. <!DOCTYPE games [ <!ELEMENT games (video_game)*> <!ELEMENT video_game (title, developer)> ]> video_game element 의모양을정의하였습니다. 그런데 XML 문서를보니 video_game element 는 attribute 도가지고있군요. attribute 정의는다음과같은방법 으로할수있습니다. <!DOCTYPE games [ <!ELEMENT games (video_game)*> <!ELEMENT video_game (title, developer)> <!ATTLIST video_game release CDATA #REQUIRED> ]> video_game element 의두 attribute 중 release attribute 에대한정의입니다. attribute 정의는 <!ATTLIST element_name attribute_name type optional> 과같은모양으로적습니다. 위의 DTD 예제에서 'CDATA' 는 release attribute 의값은그냥 string type 임을의미하고, '#REQUIRED' 는 video_game element 는꼭 release attribute 를가지고있어야한다는것을의미합니다. video_game element 의두번째 attribute 인 genre attribute 에대한정의를적으려면 어떻게해야할까요? attribute 정의가 <!ATTRIBUTE 가아닌 <!ATTLIST 로 시작한다는것을눈치채신분들이라면짐작이가능하실것같군요. 26

<!DOCTYPE games [ <!ELEMENT games (video_game)*> <!ELEMENT video_game (title, developer)> <!ATTLIST video_game release CDATA #REQUIRED genre CDATA #REQUIRED> ]> genre attribute 를추가한모습입니다. release attribute 정의바로다음에이어서쓸 수있습니다. 마지막으로 title element 와 developer element 의정의를적어봅시다. 두 element 모 두 content 로는 simple content 만을가지고있습니다. <!DOCTYPE games [ <!ELEMENT games (video_game)*> <!ELEMENT video_game (title, developer)> <!ATTLIST video_game release CDATA #REQUIRED genre CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT developer (#PCDATA)> ]> 5 장에서 simple content 는 PCDATA 라고도한다고했었습니다. 따라서위와같이 element 의정의를적을수있습니다. 이제위의 DTD 선언을 XML 문서파일의맨위 (XML declaration 이있을경우 XML declaration 과 root element 의사이 ) 에적어넣고, 그문서를 DTD 로 validation check 가가능한 XML parser 에입력하면 XML 문서가 valid 한지아닌지판별할수가있습니다. 27

5.2 XML Schema Definition(XSD) DTD 는 XML 권고안에유일하게포함되어있는 XML schema language 이기때문에, 이전절에서보았듯이별도의파일이아닌 XML 문서자체에포함시킬수있습니다. DTD 는이런점이외에도몇가지장점으로인해지금까지도널리쓰여왔지만, 몇가지해결불가능한단점도가지고있습니다. 다음은 DTD 의단점들입니다. DTD 문법은 XML 문법과다릅니다. 따라서아주작고가볍게구현된 XML parser 는 XML 문서의 DTD 부분을그냥무시해버릴수도있습니다. 매우복잡한 XML 문서의구조를나타낼경우, DTD 문서를한눈에봐서는어떤구조인지알아보기가힘들수있습니다. 이전절에서보았던 DTD 문서예제를떠올려봅시다. DTD 문서가그예제의열배정도되는길이라면, 그문서가어떤구조를나타내고있는지빠르게알아내기란쉽지않을것입니다. DTD 는다소간단한문법을가지고있기때문에, 구체적인구조를나타내기가힘듭니다. 데이터형식에대한표현이부족합니다. year 라는속성이있다면이속성은그값으로숫자만가져야하지만, 이전절에서보았듯이 DTD 는이러한경우를표현할수가없습니다. DTD 는 XML namespace 에관한 spec 이완성되기이전에만들어졌기때문에 namespace 를제대로처리하지못합니다. 이러한단점들을해결한 XML schema language 가바로 XML Schema Definition, 약자로는 XSD 입니다 ( 여기서의 "Schema" 는항상대문자로시작해야합니다 ). 이전절에서본 XML 문서를 valid 하다고판별하는 XSD 문서예제를작성하면서 XSD 문법에대해알아봅시다. <schema xmlns="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> </schema> 위의예제는가장먼저써야할부분으로, DTD 의 DOCTYPE 선언과비슷한역할을합니다. xmlns 는 namespace 를선언할때쓰는속성이라는것을 4 장에서보았습니다. 그러므로위예제는 schema 라는 root element 가있고그 element 는 "http://www.w3.org/2001/xmlschema" 라는 default namespace 에속해있다는것을나 28

타냄을알수있습니다. 이는이 XML 문서가 XSD 문서라는것을알려줍니다. elementformdefault="qualified" 속성은이 XSD 문서로판별할 XML 문서의 element 와 attribute 들이 namespace 와결합되어있다는것을뜻합니다. 지금은 XSD 문서에필수적으로써야하는속성이라는정도로만알고넘어갑시다. element 와 attribute 들의정의는모두이 schema element 내부에적힙니다. 역시 root element 인 games element 에대한정의부터적어봅시다. <schema xmlns="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> <element name="games"> <complextype></complextype> </element> </schema> XSD 문서구조는 XML 문법을그대로따르기때문에좀더직관적입니다. 위의예제에서굵게표시한부분을읽어보면 'games 라는이름을가진 element 에대한정의구나 ' 라고쉽게추측할수있습니다. games element 의 content 에대한정의는 'element' element 의 content 자리에적히게됩니다. complextype element 는 games element 가 content 로 element 를가지고있음을뜻합니다. XML 문서에서 games element 는 video_game element 를두개가지고있는데, XSD 에서는 element 개수를자유롭게지정할수있으므로, video_game element 가최소 0 번에서최대 2 번까지나타날수있다고가정해봅시다. <schema xmlns="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> <element name="games"> <complextype> <element name="video_game" minoccurs="0" maxoccurs="2"> <complextype></complextype> </element> </complextype> </element> </schema> 29

minoccurs attribute 는해당 element 가최소몇번이상나타나야하는지를지정하고, maxoccurs attribute 는최대몇번까지나타날수있는지를지정합니다. attribute 를적지않을경우기본값은 1 입니다. video_game element 도 content 로 element 를가지고있으므로 complextype element 를적어줍니다. video_game element 는 title 과 developer element 를 content 로가지고있습니다. 이를 XSD 로표현하면다음과같습니다. <schema xmlns="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> <element name="games"> <complextype> <element name="video_game" minoccurs="0" maxoccurs="unbounded"> <complextype> <sequence> <element name="title" type="string"/> <element name="developer" type="string"/> </sequence> </complextype> </element> </complextype> </element> </schema> sequence element 는그안에적혀있는 element 들이순서대로 XML 문서에등장해야한다는것을뜻합니다. element 정의에적혀있는 type attribute 는 element 가 simple content 만을가질경우그 content 가어떤형식을가지고있는지를지정합니다. 따라서 title 과 developer element 의 content 는 string 형식입니다. 형식지정에관한문법이거의없는 DTD 와는달리 XSD 는정수형, 실수형은물론날짜, 시간등여러형식을사용하여 content 모양에대해제한을둘수있습니다. 마지막으로 video_game element 의두 attribute 에관한정의를해봅시다. 30

<schema xmlns="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> <element name="games"> <complextype> <element name="video_game" minoccurs="0" maxoccurs="unbounded"> <complextype> <sequence> <element name="title" type="string"/> <element name="developer" type="string"/> </sequence> <attribute name="release" type="gyear" use="required"/> <attribute name="genre" type="string" use="required"/> </complextype> </element> </complextype> </element> </schema> type attribute 는위에서설명한것과같이 attribute 값에대한형식을지정합니다. release attribute 는그값으로연도만을가지기때문에, XSD 권고안에서정의하는연도형식인 'gyear' 를 type 으로적어두었습니다. use attribute 는이 attribute 가꼭존재해야하는지아닌지를나타냅니다. 값이 required 이므로 video_game element 는 release 와 genre attribute 를반드시가지고있어야합니다. 이제이 XSD 문서이름을 games.xsd 라하고, 이를이용하여 XML 문서를검증하 려면 XML 문서의 root element 에다음과같이 attribute 를추가해주어야합니다. <games xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="games.xsd"> xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" attribute 는이 XML 문서가 XSD 로검증할수있는문서임을알려줍니다. xsi:nonamespaceschemalocation="games.xsd" attribute 는이문서가 games.xsd 파일에의해검증될것임을뜻합니다. 31

5.3 RELAX NG XSD 는많은기능을가지고있지만, 그만큼배우고사용하기가어렵습니다. 이전절에서봤듯이같은내용을가지고있는 XML schema 문서임에도불구하고 DTD 로는몇줄안되는내용이 XSD 로는상당히길어집니다. DTD 처럼짧고간단하게쓸수있으면서 DTD 보다많은기능을가진 XML schema language 가없을까하는생각이든다면, RELAX NG 를써볼수있습니다. RELAX NG 는 Regular Language for XML Next Generation 의약자로, XSD 와흡사한모양의문법을제공하는동시에, 훨씬직관적이고간단한 compact syntax 도함께제공합니다. 여기서는 compact syntax 를이용하여이전절의 XML 문서를 valid 하다고판단하는 RELAX NG 문서를작성해보도록하겠습니다. element games {} RELAX NG compact syntax 에서는 DTD 의 DOCTYPE 선언이나 XSD 의 schema element 같은선언이필요없습니다. 그냥바로 root element 정의부터작성하면됩니다. 위의예제는 games 라는 element 가존재해야한다는것을뜻합니다. games element 의 content 에대한정의는중괄호 ({}) 안에적습니다. element games { } element video_game {}* RELAX NG compact syntax 는상당히직관적입니다. 위의예제를보면 'games element 안에 video_game element 가있구나 ' 라고어렵지않게추측할수있습니다. '*'(asterisk) 는 DTD 에서와같이 video_game element 가 0 번혹은그이상반복될수있음을뜻합니다. 이제 video_game element 에 attribute 정의를추가해봅시다. attribute 정의는 element 정의와거의흡사한모양을가지고있습니다. 32

element games { element video_game { attribute release { xsd:gyear }, attribute genre { text } }* } video_game element 정의에 release 와 genre attribute 정의를추가하였습니다. attribute 정의의중괄호 ('{}') 안에는 attribute 값의형식이들어갑니다. release attribute 는연도를값으로가지므로중괄호안에 xsd:gyear 라고적었고, genre attribute 는일반문자열을값으로가지므로 text 라고적었습니다. xsd:gyear 형식은 XSD 설명에서봤듯이 XSD 권고안에서정의하는데이터타입입니다. RELAX NG 에서는 XSD 의데이터타입을사용할수있습니다. element games { element video_game { attribute release { xsd:gyear }, attribute genre { text }, element title { text }, element developer { text } }* } video_game element 안에 title 과 developer element 정의를추가하면 schema 문서가 완성됩니다. XSD 는물론 DTD 보다도짧고쉬운문법을가지고있음을알수있 습니다. RELAX NG 는 DTD 나 XSD 와는달리 XML 문서와 RELAX NG 문서를연결시키는방법에대한문법이나제한이없습니다. 대신 RELAX NG 를지원하는 parser 나프로그램에서문서연결에대한설정을한후 XML 문서의 validation 을체크해볼수있습니다. 33

6. XML API XML 은인간과어플리케이션, 혹은어플리케이션과어플리케이션사이의데이터교환을쉽게하기위해만들어졌습니다. 이는인간뿐만아니라컴퓨터도 XML 문서를읽고해석할수있어야한다는뜻입니다. 컴퓨터가 XML 문서를이해할수있게도와주는 API(Application Programming Interface) 가몇종류있는데, 그중에서가장유명한 DOM 과 SAX 에대해서간단히소개하도록하겠습니다. 6.1 DOM DOM 은 Document Object Model 의약자입니다. DOM 이 XML 문서를어떻게처리 하는지예제를통해알아봅시다. <video_game> <title>starcraft</title> <developer>blizzard Entertainment</developer> 위의 XML 문서를 DOM 방식으로만들어진 XML parser 가읽어들였다고가정해 봅시다. parser 는위의문서를다음과같은 tree 구조의객체로만들어메모리에 저장합니다. <video_game> video_game node : type = ELEMENT_NODE tag name = "video_game" value = not exist children = title, developer node <title> <developer> deveoper node : type = ELEMENT_NODE tag name = "developer" value = "Blizzard Entertainment" StarCraft Blizzard Entertainment text node : type = TEXT_NODE tag name = not exist value = "Blizzard Entertainment" 34

이제이 XML 문서의데이터를이용할어플리케이션은 DOM parser 에게 node 단위의데이터객체를달라고요청할수있습니다 ( 예를들면 'developer element node 에대한정보를달라 ' 라는식으로 ). 이렇게어플리케이션이 parser 에게직접어떤데이터를달라고요청한다는뜻에서 DOM parser 를 pull parser 라고도합니다. DOM 은 XML 문서를전부메모리에올려놓고작업을시작하기때문에, 원하는데이터가어떤부분에있든지바로접근이가능하고, 데이터를추가, 수정하거나삭제하는것도가능합니다. 반면, 맨처음에 XML 문서를전부읽어서메모리에올려야하기때문에초기구동속도가느리고, XML 문서가아주큰경우메모리공간이부족할수도있습니다. 6.2 SAX SAX 는 Simple API for XML 의약자로, XML 문서를순차적으로읽어서처리하는 방식입니다. 이전절의 XML 문서예제를 SAX 방식의 parser 로처리한다면다음 과같습니다. start_element : video_game start_element : title character : StarCraft end_element : title start_element : developer character : Blizzard Entertainment end_element : developer end_element : video_game SAX 는 XML 문서를하나의 string 으로인식하여처음부터쭉읽어나갑니다. 그러다가여는태그를만나면 ' 여기여는태그가있다!' 라고어플리케이션에알려주고, character(simple content) 를만나면 ' 여기 character 가있다!' 라고알려주고, 닫는태그를만나면 ' 여기닫는태그가있다!' 라고알려주는방식으로작업을진행합니다. 이렇게차례대로일을진행하다가뭔가특별한일이생기면다른 component 에이일을보고하는방식을 event-driven 방식이라고합니다. parser 가알아서어플리케이션에게데이터를밀어주기때문에 SAX parser 를 push parser 라고도합니다. 35

SAX 는문서를처음부터끝까지읽어나가기만하면되기때문에메모리를사용할필요가없습니다. 따라서문서를처리하는속도가빠르고, 매우큰 XML 문서를처리하는데에도어려움이없습니다. 하지만문서를차례대로읽기때문에내가원하는부분의데이터만얻어오는일이불가능하고, 읽기이외의작업은불가능하기때문에문서를수정할수가없습니다. 또한사용방법이 DOM 에비해다소어렵습니다. DOM 과 SAX 는각각상반되는장단점을가지고있기때문에, 원하는작업의특 성을잘생각하여어떤방식의 parser 를고를것인지판단해야합니다. 지금까지 XML 이어떤기술이고, 어떻게다룰수있는지에대해이야기해보았습 니다. 이문서가여러분들이 XML 을이해하는데에조금이나마보탬이되었기를 바랍니다. 36

Appendix A. 문서정보 A.1 문서이력 문서목적 XML 에대해이해하는것을돕는다. 작성자 이혜린 / salad@novonetworks.com 작성이력 최초작성 : 2010-10 37

Appendix B. References Beginning XML 2 nd, 3 rd Edition 한국어판 Hunter, Watt, Rafter, Duckett, Ayers, Chase, Fawcett, Gaven, Patterson XML 의개념과다양한응용기술을소개하는책입니다. Extensible Markup Language (XML) 1.0 (Fifth Edition) W3C Recommendation 26 November 2008 http://www.w3.org/tr/xml/ W3C 의 XML 1.0 권고안입니다. Namespaces in XML 1.0 (Third Edition) W3C Recommendation 8 December 2009 http://www.w3.org/tr/xml-names/ W3C 의 XML 1.0 namespace 권고안입니다. Extensible Markup Language (XML) 1.1 (Second Edition) W3C Recommendation 16 August 2006, edited in place 29 September 2006 http://www.w3.org/tr/xml11/ W3C 의 XML 1.1 권고안입니다. XML Tutorial http://www.w3schools.com/xml/default.asp XML 문서작성법을알수있는 tutorial 입니다. XML Path Language (XPath) W3C Recommendation 16 November 1999 http://www.w3.org/tr/xpath/ W3C 의 XPath 1.0 권고안입니다. E4X Tutorial https://developer.mozilla.org/en/e4x_tutorial mozilla developer center 의 E4X tutorial 페이지입니다. 38

DTD Tutorial http://www.w3schools.com/dtd/default.asp DTD 문서작성법을알수있는 tutorial 입니다. XML Schema Part 0: Primer Second Edition W3C Recommendation 28 October 2004 http://www.w3.org/tr/xmlschema-0/ W3C 의 XSD 권고안입니다. XML Schema Tutorial http://www.w3schools.com/schema/default.asp XSD 문서작성법을알수있는 tutorial 입니다. Interactive XML tutorials http://xmlzoo.net/ DTD 와 XSD 를이용하여직접 XML 문서의 validation 을체크해볼수있습니다. RELAX NG home page http://relaxng.org/ RELAX NG 의홈페이지입니다. specification 문서와문법 tutorial 등을볼수있습니다. 다음은이문서에서는소개하고있지않은 XML 관련기술에대해궁금해하실분들을위한문서입니다. The Extensible Stylesheet Language Family (XSL) http://www.w3.org/style/xsl/ XSL(Extensible Stylesheet Language) 의홈페이지입니다. 권고안, tutorial 등다양한문서들을볼수있습니다. 읽기전에 HTML 에대해미리익혀두시는것이좋습니다. Cascading Style Sheets - Learning CSS http://www.w3.org/style/css/learning CSS(Cascading Style Sheets) 의 tutorial 페이지입니다. 역시읽기전에 HTML 에대해미리익혀두시는것이좋습니다. 39