XML 문서처리 (extensible Markup Language) 김덕태 (deogtae@yahoo.co.kr) Bi Consulting. Co., Ltd. 2000년 4월 1
목차 XML(eXtensible Markup Language) 소개 XML 문법의개요 XML 이름공간 : 서로다른규격의 XML 문서들을통합할수있는표준 XML 링킹표준 : XML 문서들을서로연결시킬수있는확장된링킹표준 자바기반 XML 구문분석기 (SAX, DOM) DOM 객체모델 XHTML: HTML 4.0 문서규격을 XML 문서규격을만족하도록수정한문서규격 XSL (Extensible Stylesheet Language): XML 문서를다른규격의 XML 문서로변환하고표시하기위한변환정의문서 2
소개 XML 문서 XML 처리기 + XML 처리기응용 확장가능한문법을제공하는문서마크업언어의일종 마크업 (Markup): 문서내용의논리적구조및표현정보 XML 처리기 XML 문서를읽어들여구문분석한후, 그내용과구조에대한접근을제공하는 S/W 모듈 XML 처리기응용 XML 처리기를내장 ( 혹은호출 ) 하여처리 ( 편집, 검증, 저장, 전송, 검색, 구문분석, 변환, 포매팅등등 ) 기능을제공하는 XML 처리기응용 S/W 3
제품, 플랫폼독립성 단순성 XML 의특징 (1) HTML 과유사한텍스트기반문서마크업언어이므로, 텍스트기반 S/W 도구를비롯한다양한 S/W 도구를사용하여처리할수있다. SGML (Standard Generalized Markup Language) 을단순화한문서마크업언어로서, SGML 의일종이다. 확장성 문서타입정의기능을통하여다양한 XML 기반문서형식 ( 새로운태그의정의등 ) 을정의하여사용할수있다. 정확성 HTML 문서타입도문법에약간의제약을가하면 XML 문서타입중하나가된다. 주어진응용에가장적합한문서타입정의를통하여정보를표현함으로써문서정보를가장적절히표현할수있다. 이러한특징은문서처리의유연성과효율성을제공한다. 4
XML 의특징 (2) 통일성 다양한 XML 문서타입을정의하여사용하더라도기본골격은 XML 문서형식을따른다. 다양한 XML 응용 S/W 에서 XML 처리기를재사용할수있다. 출력매체독립성 문서의내용이특정출력형식과는독립적이다. HTML 과는달리 XML 문서가최종적으로출력되는형태는해당 XML 문서타입을지원하는 XML 처리기응용에달려있다. 문서의내용을다양한형태 ( 테이블, 그래프등등 ) 로출력할수있다. 문서의내용을다양한형식의다른문서 (HTML, 다른 XML 문서, RTF, MS Word, Postscript, PDF, TeX, LaTeX) 로의변환이가능하다. XML 문서의출력은클라이언트측 ( 웹브라우저, 애플릿등 ) 및서버측 ( 서블릿등 ) 에서이루어질수있다. 이때, 경우에따라 HTML 문서등다른문서형식으로의변환을통하여출력하는방법이종종사용된다. 5
XML 문서타입의종류 (1) XML 문서타입은다음과같은부류로나뉘어질수있다. 개별적인용도를위해정의한새로운문서형식특정분야에서받아들여지는표준형식일반적으로폭넓게받아들여지는표준형식 XML 문서타입정의모음 http://www.schema.net/ http://wdvl.com/authoring/languages/xml/specifications.html http://www.oasis-open.org/cover/xml.html 웹분야문서타입 XHTML (HTML 문서타입의 XML 타입정의 ) : http://www.w3.org/tr/wd-html-in-xml/ Resource Description Framework (RDF) 다양한웹기반메타데이타의통합 http://www.w3.org/rdf/ Platform for Internet Content Selection (PICS) 레이블 ( 메타데이타 ) 와인터넷콘텐트와의연동 http://www.w3.org/pics/ 6
XML 문서타입의종류 (2) Platform for Privacy Preferences (P3P) http://www.w3.org/p3p/ Digital Signature (DSig) http://www.w3.org/dsig/overview.html Web Interface Definition Language (WIDL) http://www.w3.org/tr/note-widl 정보검색분야문서타입 A Query Language for XML (XML-QL) SQL 유사질의어 http://www.w3.org/tr/note-xml-ql/ 사용자인터페이스분야문서타입 Extensible Forms Description Language (XFDL) 폼기반사용자인터페이스제공 http://www.w3.org/tr/note-xfdl 7
XML 문서타입의종류 (3) 그래픽스, 멀티미디아 Vector Markup Language (VML) 벡터그래픽 http://www.w3.org/tr/note-vml Scalable Vector Graphics (SVG) 2 차원그래픽스표현 ( 벡터그래픽도형, 이미지, 텍스트 ) http://www.w3.org/graphics/svg/ Precision Graphics Markup Language (PGML) 고정밀 2 차원그래픽스표현 ( 폰트, 색상, 배치, 합성등 ) PostScript, PDF (Portable Ducument Format) 에공통된이미징모델채용 http://www.w3.org/tr/1998/note-pgml X3D 3 차원그래픽표현 VRML 의확장 : http://www.web3d.org/fs_specifications.htm Synchronized Multimedia Integration Language (SMIL) 서로독립적인멀티미디아자료의동기화된프리젠테이션 http://www.w3.org/audiovideo/ 8
XML 문서타입의종류 (4) JSML (Java Speech Markup Language) http://java.sun.com/products/java-media/speech/fordevelopers/jsml/ 일반문서, 프리젠테이션타입 TeXML TeX과유사 http://www.alphaworks.ibm.com/formula/texml XslSliderMaker 슬라이드프리젠테이션 http://www.inria.fr/koala/xml/xslprocessor/slide.0.1.html 수학, 과학, 예술 Mathematical Markup Language (MathML) 수학, 과학기호및수식표현 http://www.w3.org/math/ Chemical Markup Language 화학분자식 http://ala.vsms.nottingham.ac.uk/vsms/java/jumbo/cml12/cml/ Music Markup Language (MusicML) http://tcf.nl/3.0/musicml/index.html 9
XML 문법의기초 (1) XML 1.0 표준문서 http://www.w3.org/tr/1998/rec-xml-19980210 XML 문서는다음과같은순서의기본형식을갖는다. XML 선언 ( 생략가능 ) 0개이상의문서타입선언 1개의루트요소 유효한 (valid) 문서 XML 기본문법에맞는 (well-formed) 문서이어야한다. 문서내에문서타입선언이있어야한다. 문서가선언된문서타입정의를따라야한다. 검증용 XML 처리기는구문분석과정에서문서의유효성을검증한다. XML 선언 문법 : <?xml version=1.0 encoding=" 인코딩이름 standalone="yes no"?> 인코딩선언을통하여문서내에사용된문자의인코딩을지정할수있다. 인코딩이름은 IANA 표준인코딩이름을사용하여야한다. 예 ) "UTF-8", "UTF-16", "ISO-8859-1", "EUC-KR", 등등 10
XML 문법의기초 (2) IANA 표준인코딩이름문서 ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets 인코딩선언이생략된경우, 문서의문자인코딩은 "UTF-8" 혹은 "UTF-16" ( 유니코드 ) 으로가정되며, 문서의처음에오는바이트순서표식 (#xfeff) 에의해이들인코딩을구분한다. 모든 XML 처리기는 "UTF-8", "UTF-16" 인코딩을지원해야하나, 기타인코딩의지원은선택사항이다. standalone 선언이생략되면 "standalone=no" 를선언한것과동일하며, yes인경우에는외부 DTD를참조하지않음을의미한다. 이름 유니코드레터 (letter), 유니코드숫자, `_', `:', `.', `-' 등으로이루어진식별자이다. 요소타입이름 ( 태그이름 ), 속성이름, ID 이름, 개체이름, 표기이름등을나타내는데사용된다. 문자 ``"'' 의쌍이구분자로서사용되는모든경우에대하여, 문자 ``''' 의쌍으로대신할수있다. 11
XML 문법의기초 (3) 요소 (element) 요소는시작태그와끝태그로묶여진논리적문서단위이다. 태그이름과요소타입이름은동의어이다. 요소의문법 : 시작태그요소내용끝태그 시작태그문법 : < 태그이름속성이름 =" 값 " 속성이름 =" 값 "...> 예 ) <termdef id="dt-dog" term="dog"> 끝태그문법 : </ 태그이름 > 예 ) </termdef> 빈태그문법 : < 태그이름속성이름 =" 값 " 속성이름 =" 값 ".../> : 내용이없는요소를나타내며, < 태그이름...></ 태그이름 > 과동일한의미를갖는다. 예 ) <termdef id="dt-dog" term="dog"/> HTML 과는달리대소문자를구분한다. 속성값은 `<' 를제외한문자로이루어진다. 요소내용은자식요소, 문자데이타, CDATA 섹션들로이루어진다. 유효한문서는선언된문서타입정의내의태그만을사용해야하며그문법을따라야한다. 12
XML 문법의기초 (4) 문자데이타 `<', `&' 문자는마크업에사용되므로직접표현될수없다. 문자참조 이들문자는문자그자체를나타내기위해서는문자참조나개체참조 ``<'', ``&'' 를사용해야한다. 문법 : 
 진수문자코드값 ; 문법 :  진수문자코드값 ; 문자데이타로직접표현하기곤란한어떠한문자도 ISO 10646 ( 유니코드의 32 비트확장판 ) 문자코드값으로표현할수있다. 문자참조는요소내용, 속성값, 문서타입정의등문서의대부분의곳에서사용될수있다. CDATA 섹션 문법 : <![CDATA[ 문자열 ]]> 예 ) <![CDATA[<greeting>Hello, world!</greeting>]]> 마크업표식을포함하는문자열을해석하지않고일반문자데이타로서표현하기위해사용한다. 요소내용에서만나타날수있다. 13
주석 문법 : <!--'' 문자열 ``--> ` 문자열 ' 에는 ``--'' 가올수없다. XML 문법의기초 (5) 마크업표식이외의어느곳에서도나타날수있다. 예 ) intro.xml <?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE seminar SYSTEM "seminar.dtd"> <!-- XML 예제화일주석예 --> <seminar> <title>xml 문서처리 </title> <author> 김덕태 </author> 14
XML 문법의기초 (6) <section> <head>xml 문법의기초 </head> <itemize> <item> XML 문서내에다음과같은 XML 특수기호를사용하기위해서는개체참조를이용하거나, <example> System.out.println(1 < 2); System.out.println(true && false) </example> </item> <item> CDATA 섹션을이용하거나, <example><![cdata[ System.out.println(1 < 2); System.out.println(true && false) ]]> </example> </item> <item> 처리기응용의처리에맡긴다. <examplefile file="xml\test.java"/> </item> <item> `가 ' 대신문자참조 `가' 라고표현할수있다. </item> </itemize> </section> </seminar> 15
문서타입선언 (1) 문서타입선언 목적 : XML 문서에문서타입정의 (DTD) 를포함시키기위한방법제공 문법 : <!DOCTYPE 문서타입이름문서타입정의식별자 [ 문서타입정의 ]> 유효한문서는문서타입이름이 XML 문서의루트요소타입이름 ( 태그이름 ) 과같아야한다. 문서타입정의식별자와문서타입정의부모두생략될수있다. ` 문서타입정의식별자 ' 를지정함으로써분리되어저장되어있는외부문서타입정의를포함시킬수있다. 내부문서타입정의예 <?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE seminar [ <!ELEMENT seminar (title, author?, section*)>... <!ATTLIST examplefile file CDATA #REQUIRED>... ]> <seminar>... </seminar> 16
문서타입선언 (2) 문서타입정의식별자 문서타입선언에서 URI 에의해식별되는문서타입정의를 XML 문서내에논리적으로포함시키는기능을제공한다. 문법 : SYSTEM " 시스템 URI ` 시스템 URI' 는특정조직내부에서만사용되는문서타입정의가저장되어있는 URI 이다. 문법 : PUBLIC " 공개 URI" " 시스템 URI" ` 공개 URI' 는폭넓게받아들여지는문서타입정의가저장되어있는 URI 이며, 이겨우 XML 처리기는표준문서타입정의라이브러리를검색하여해당문서타입정의를검색할수있다. XML 처리기는 URI 내의비아스키문자는 ``%HH'' 형태의문자열로변환하여처리하여야한다. ( 여기서 HH 는해당문자의 UTF-8 인코딩코드값을 16 진수로나타낸값이다.) 이 URI 에저장된문서타입정의의첫행에다음선언이올수있다. ( 각선언부가생략가능하다.) <?xml version="1.0" encoding=" 인코딩이름 "?> 17
문서타입정의 (1) 문서타입정의 ` 문서타입정의 ' 는 0 개이상의마크업선언 ( 요소선언, 속성목록선언, 개체선언, 매개변수개체선언, 표기선언 ) 및매개변수개체참조로이루어진다. 매개변수개체참조는마크업선언내에도올수있다. 요소선언 문서타입정의는내포될수있으며, 누적되고, 내부문서타입정의는외부문서타입정의보다우선순위가높다. 문법 : <!ELEMENT 태그이름요소내용패턴 > 다음각요소내용패턴은이요소가가질수있는요소내용의형식을정의한다. ANY: 어떠한형식도올수있다. 예 ) <!ELEMENT container ANY> EMPTY: 요소내용을가질수없다. 예 ) <!ELEMENT br EMPTY> (#PCDATA#): 요소내용으로문자데이타, CDATA 섹션만이올수있다. 예 ) <!ELEMENT p (#PCDATA) > 18
문서타입정의 (2) (#PCDATA# 태그이름 태그이름...)*: 요소내용으로문자데이타, 문자참조, 개체참조, CDATA 섹션및주어진태그의요소들을가질수있다. 예 ) <!ELEMENT p (#PCDATA emph)* > 정규수식 : 주어진패턴의자식요소들만을가질수있다. 정규수식은태그이름들과연산자 ` ' ( 선택 ), `,' ( 연결 ), 괄호 ( 그룹화 ), `?' (0번혹은 1번 ), `*' (0번이상반복), `+' (1번이상반복) 를사용하여나타낸다. 예 1) <!ELEMENT spec (front, body, back?)> 예 2) <!ELEMENT div1 (head, (p list note)*, div2*)> 속성 (attribute) 목록선언 요소 ( 태그 ) 에사용될수있는속성이름, 속성자료형, 디폴트값들을정의한다. 문법 : <!ATTLIST 태그이름속성이름속성자료형디폴트값...> `속성자료형 ' 은다음과같은값으로지정한다. CDATA: 일반스트링. NMTOKEN: 임의의이름 NMTOKENS: 공백류문자로구분된임의의이름목록 ( 이름 이름...): 주어진이름중 1개 19
문서타입정의 (3) ID: ID 이름. 하나의 XML 문서내에서는이태그의모든요소에서속성값으로지정된이이름이모두서로달라야한다. 문서내에서요소를링크시키기위한주소로사용하기위한것이주목적이다. 속성이름으로 "id" 를많이사용한다. IDREF: ID 이름. 하나의 XML 문서내에서속성자료형 ID의해당속성값을갖는요소로링크시키기위한것이주목적이다. IDREFS: 공백류문자로구분된 ID 이름목록.. `디폴트값 ' 은해당요소의디폴트속성값에대한사항을정의한다. " 속성값 ": 요소에서이속성이지정되지않은경우사용될디폴트속성값 #FIXED " 속성값 ": 이속성디폴트값만이이속성이가질수있는유일한값이다. #IMPLIED: 디폴트값을정의하지않고처리기응용이디폴트값들제공. #REQUIRED: 요소에서이속성이반드시지정되어야하며, 디폴트값은없다. 예약된속성 xml:space를다음과같이속성목록에선언해주면 XML 처리기가요소내의공백류문자를정규화하지않고있는그대로처리기응용에넘겨준다. <!ATTLIST code xml:space (default preserver) preserve > 20
문서타입정의 (4) 예 <!ATTLIST termdef id ID #REQUIRED name CDATA #IMPLIED> <!ATTLIST list type (bullets ordered glossary) "ordered"> <!ATTLIST form method CDATA #FIXED "POST"> 예졔 : seminar.dtd <?xml encoding="euc-kr"?> <!ELEMENT seminar (title, author?, section*)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT section (head, (itemize example examplefile)*)> <!ELEMENT head (#PCDATA)> <!ELEMENT itemize (item)+> <!ELEMENT item (#PCDATA example examplefile itemize)*> <!ELEMENT example (#PCDATA)> <!ELEMENT examplefile EMPTY> <!ATTLIST examplefile file CDATA #REQUIRED> 21
개체 개체 (entity) 와개체참조 개체는문서타입정의내의개체선언에의해이름과내용을부여받는다. 개체의내용은요소, 문자데이타, CDATA 섹션들로이루어질수있다. 즉, XML 문서의일부로서정의된다. 내부개체는문서타입정의내에직접나타나고, 외부개체는별도의화일 (URI) 에저장된다. 개체의내용은 XML 문서내의개체참조에의해참조 ( 포함 ) 된다. 한번정의된개체를여러곳에서참조함으로써반복적인 XML 문서작업을줄이고, 손쉽게관리할수있다. 일종의매크로기능이다. 개체참조 문법 : & 개체이름 ; 개체참조는요소내용및속성값에서만나타날수있으며, XML 처리기에의해해당개체의내용으로대체된후, 구문분석된다. ``<'' (``<''), ``&''(``&''), ``gt;''(``>''), ``quot;'(``"''), ``apos;''(``''') 은해당문자참조로의정의가내장되어있다. 22
개체선언 개체참조가개체정의에나타나는경우, 그참조가해석되지않고, 있는그대로다루어진다. 다음페이지에는다양한문자개체가정의되어있으므로, 문서타입정의내에포함시켜사용할수있다. http://www.schema.net/entities/ 내부개체선언 문법 : <!ENTITY 개체이름 " 내부개체정의 "> `내부개체정의 ' 내에서문자 `%' 는매개변수개체참조로서해석된다. 외부개체선언 문법 : <!ENTITY 개체이름외부개체식별자 > 개체내용은 `외부개체식별자 ' 가나타내는 URI의내용이다. 외부개체식별자는문서타입정의식별자와동일한문법과의미를가지며, 단지해당 URI에저장된내용이개체정의라는차이가있을뿐이다. 속성목록선언의 `속성자료형 ' 으로다음을사용할수있다. ENTITY: 개체이름. 이진데이타등 #PCDATA로전달하기곤란한경우유용. ENTITIES: 공백류문자로구분된개체이름목록 23
예 : entity_test.xml <?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE seminar SYSTEM "seminar.dtd" [ <!ENTITY author " 김덕태 "> <!ENTITY head1 "<head> 개체의의미 </head>"> <!ENTITY section2 SYSTEM "section2.xml"> ]> <seminar> <title>xml 개체처리 </title> <author>&author;</author> <section> &head1; <itemize> <item> 개체의내용은요소, 문자데이타, CDATA 섹션들로이루어진내용으로정의될수있다. </item> </itemize> </section> §ion2; </seminar> 24
예 : section2.xml <?xml encoding="euc-kr"?> <section> <head> 외부개체정의 </head> <itemize> <item> 이와같이외부에정의된개체를개체참조를통하여포함시킬수있다. </item> </itemize> </section> 25
매개변수개체 (entity) 와매개변수개체참조 매개변수개체 매개변수개체는문서타입정의내의매개변수개체선언에의해이름과내용을부여받는다. 매개변수개체의내용은문서타입정의이일부로서정의된다. 내부매개변수개체정의는문서타입정의내에직접나타나고, 외부매개변수개체정의는별도의화일 (URI) 에저장된다. 개체의내용은문서타입정의내의매개변수개체참조에의해참조 ( 포함 ) 된다. 한번정의된매개변수개체를여러곳에서참조함으로써반복적인문서타입정의작업을줄이고, 손쉽게관리할수있다. 일종의매크로기능이다. 매개변수개체참조 문법 : % 매개변수개체이름 ; 요소내용과속성값내에서는해석되지않고, 문서타입정의내에서만해석된다. 문서타입정의내의거의모든곳에서사용될수있다. 26
매개변수개체선언 (1) 매개변수개체선언및문서타입선언의외부개체식별자가나타내는 URI 에저장되어있는개체내용은문서타입정의의일부로서마크업선언과조건부섹션들로이루어진다. 내부매개변수개체선언문법 : <!ENTITY % 매개변수개체이름 " 내부매개변수개체정의 "> 외부매개변수개체선언문법 : <!ENTITY % 매개변수개체이름외부매개변수개체식별자 > 정의된내용이문서타입정의의일부라는차이점만있을뿐, 개체식별자와문법및의미가동일하다. 포함조건부섹션문법 : <![INCLUDE[ 매개변수개체정의 ]]> 배제조건부섹션문법 : <![IGNORE[ 매개변수개체정의 ]]> 27
매개변수개체선언 (2) 예 ) <!ENTITY % draft 'INCLUDE' > <!ENTITY % final 'IGNORE' > <![%draft;[ <!ELEMENT book (comments*, title, body, supplements?)> ]]> <![%final;[ <!ELEMENT book (title, body, supplements?)> ]]> 28
표기 (notation) 표기이름은처리기명령의대상응용혹은구문분석되지않는개체의형식을식별하기위한식별자이다. 응용식별자는 XML 처리기가호출할응용을식별하는 URI 이다. 선언문법 : <!NOTATION 표기이름응용식별자 > ` 응용식별자 ' 의문법 SYSTEM " 시스템 URI" PUBLIC " 공개 URI" PUBLIC " 공개 URI" " 시스템 URI 속성목록선언의 ` 속성자료형 ' 으로다음을지정함으로써주어진표기이름중 1 개를속성값으로사용할수있도록선언할수있다. NOTATION ( 표기이름 표기이름...) 29
처리기명령 (Processing Instruction) 문법 : <? 표기이름명령?> XML 처리기가주어진문자열의 ` 명령 ' 을 ` 표기이름 ' 의선언에의해정의된외부개체식별자에의해식별된식별된응용에전달한다. 마크업표식이외의어느곳에서도나타날수있다. ` 표기이름 ' 은표기선언에의해선언된식별자 xml, XML 등으로시작할수없다. 30
구문분석되지않는 (unparsed) 개체 이미지화일등 XML 문서형식이아닌데이타를나타내기위해서사용된다. 선언문법 : <!ENTITY 개체이름외부개체식별자 NDATA 표기이름 > 외부개체식별자가나타내는 URI 는해당데이타의위치를나타내는 URI 이다. 구문분석되지않는개체는속성목록선언에서 ` 속성자료형 ' 이다음과같은값으로선언된경우의속성값으로서만사용될수있다. ENTITY: 구문분석되지않는개체의이름. ENTITIES: 구문분석되지않는개체의이름목록. XML 처리기는구문분석되지않는개체참조가나타나면, 해당 ` 표기이름 ' 이나타내는 URI 가식별하는응용에 ` 외부개체식별자 ' 가나타내는 URI 를전달한다. 31
XML 이름공간 (1) 목적 : XML 요소, 속성이름을 URI 로식별되는이름공간과연관시켜구분 용도 전세계적으로고유한요소, 속성이름생성 : 이름충돌해결및의미구분 스키마 (DTD 포함 ) 의재사용 서로다른규격의 XML 문서들을 1개의문서내에통합. XML Namespaces 1.0 Recommendation http://www.w3.org/tr/1999/rec-xml-names-19990114/ XML 이름공간은 URI로식별한다. 이름공간의참조 이름에 `: 이사용된경우, 앞부분이이름공간을나타내는접두어로해석된다. 이름공간의선언 요소의속성으로다음과같이이름공간을선언한다. 하나의요소에여러개의이름공간선언을할수있다. 자손요소에서선언된동일이름공간선언은조상요소에선언된이름공간 선언을재정의 (override) 할수있다. 32
문제점 XML 이름공간 (2) xmlns: 이름공간접두어 = 이름공간의 URI 이요소및모든자손요소의요소, 속성이름에이름공간접두어를붙여해당이름공간을지정할수있다. xmlns= 이름공간의 URI 이요소및모든자손요소의요소, 속성이름에대하여, 이름공간접두어가붙지않은요소, 속성이름은디폴트로이이름공간에속하게된다. ( 디폴트이름공간 ) xmlns= 조상요소에선언된디폴트이름공간선언을이요소및모든자손요소에대하여취소시킨다. 이름공간을사용하는경우유효한문서가되기어렵다. 유효한문서가되려면다양한이름공간의이름들이하나의 DTD 내에정의되어있어야한다. 33
예제 : namespace.xml XML 이름공간 (3) <?xml version="1.0" encoding="euc-kr"?> <seminar> <section xmlns="http://www.example.com/book" xmlns:html="http://www.w3.org/tr/rec-html40"> <title>xml 소개 </title> <html:ul> <html:li>xml의유래 </html:li> <html:li>xml의용도 </html:li> <li xmlns="http://www.w3.org/tr/rec-html40">xml 처리기 </li> </html:ul> </section> </seminar> 34
XML 링킹 (linking) 표준 (1) 링크 (link): 2 개이상의데이타객체 ( 혹은그일부분 ) 사이의명시적관계 XML Linking Language (XLink) 명세문서 : http://www.w3.org/tr/xlink/ 목적 : HTML 링크인단방향링크이외에더강력한링크기능 ( 여러방향링크, 확장링크, 아웃오브라인링크 ) 제공 이름공간식별자 : http://www.w3.org/1999/xlink XML Pointer Language (XPointer) 명세문서 : http://www.w3.org/tr/xptr 목적 : 링크의 id 속성이정의되어있지않아도수식으로표현되는문서조각식별자로임의의문서조각을나타낼수있다. 예 ) <xlink:simple href='doc.xml#xpointer(book/chapter[position() <= 5])' /> 35
XML 링킹 (linking) 표준 (2) 위치식별자 (Locator) 목적 : URI 의확장 다음중 1가지형태를갖는다. URI: 자원의주소. 보통, 1개의문서전체를나타낸다. # 이름 #XPointer URI# 이름 URI#XPointer 이들형태중 `#' 대신에 ` ' 가사용될수있다. `이름 ' 은 XPointer의 `id( 이름 ) 과동일하다. XPointer 목적 : XML 문서내의요소혹은요소의일부에대한주소 일반적인자원의식별자는 URI를사용한다. XML 문서내의일부를나타내는식별자는 XPointer를사용해야한다. 36
자바 XML 구문분석기 (1) XML 구문분석기의종류 SAX 구문분석기 이벤트기반 XML 구문분석기 구문분석중에구문분석기와상호작용하며동작하는프로그램을작성할수있게해준다. DOM 구문분석기 XML 문서를구문분석하여 DOM 객체모델을생성하는구문분석기 JAXP (Java API for XML Parsing) 1.0 XML 1.0, SAX 1.0, DOM (Core) Level 1, JAXP 1.0 지원 http://java.sun.com/xml/ javax.xml.parsers, org.xml.sax, org.w3c.dom 패키지포함 IBM XML Parser for Java 3.0.1 XML 1.0, SAX 1.0, SAX 2.0 베타, DOM Level 1, DOM Level 2 베타지원 http://www.alphaworks.ibm.com/formula/xml/ Docuverse DOM SDK 1.0A5 XML 1.0, SAX 1.0, DOM (Core) Level 1, DOM (HTML) Level 1, JAXP 1.0 지원 http://www.docuverse.com/domsdk/ 37
자바 XML 구문분석기 (2) Microsoft XML Parser in Java http://www.microsoft.com/xml 문서 : http://www.microsoft.com/java/sdk/32/default.htm 38
SAX API 1.0 (Simple API for XML) 목적 : SAX 드라이버 (SAX 지원 XML 구문분석기 ) 에대한인터페이스정의 org.xml.sax 패키지 홈페이지 : http://www.megginson.com/sax/ 전체구조 PaserFactory.makeParser() 1. 생성 2. 이벤트처리기등록 (setdocumenthandler, seterrorhandler, \ / setdtdhandler, setentityresolver) SAX 구문분석기 <--------------------- (SAX 지원 XML 구문분석기 ) 이벤트처리기 3. parse(inputsource) 4. 이벤트 ---------------------> 39
SAX API: ParserFactory 클래스 목적 : SAX 지원구문분석기의생성 메쏘드 ParserFactory.makeParser() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NullPointerException, ClassCastException : "org.xml.sax.parser" 시스템프로퍼티로지정된클래스이름의 SAX 지원구문분석기생성 ParserFactory.makeParser(String parser) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ClassCastException : 주어진클래스이름의 SAX 지원구문분석기생성. 시스템프로퍼티를설정하기곤란한애플릿에서유용하다. 40
SAX API: Parser 인터페이스 목적 : 구문분석의시동, 이벤트처리기 ( 콜백 ) 등록 구문분석도중에도다른이벤트처리기로재등록할수있다. 메쏘드 parse(inputsource source) throws SAXException, IOException SAX 구문분석기가 XML 문서 source의구문분석을시작하게한다. 구문분석이진행중에는호출할수없다. parse(string systemid) throws SAXException, IOException = parse(new InputSource(systemId)) setdocumenthandler(documenthandler handler) 문서이벤트처리기를등록한다. 등록되어있지않으면모든문서이벤트가무시된다. seterrorhandler(errorhandler handler) 오류이벤트처리기를등록한다. 등록되어있지않으면치명적오류를제외한모든오류이벤트가무시된다. setdtdhandler(dtdhandler handler) DTD 이벤트처리기를등록한다. 등록되어있지않으면모든 DTD 이벤트가무시된다. 41
SAX API: Parser 인터페이스 setentityresolver(entityresolver resolver) EntityResolver를등록한다. 등록되어있지않으면 SAX 구문분석기에의해처리된다. setlocale(locale locale) throws SAXException 경고, 오류메시지의로캘. 해당로캘을지원하지않는경우에는예외발생. 42
SAX API: InputSource 클래스 목적 : 문자스트림, 바이트스트림, 시스템 URI 등으로검색할수있는 XML 문서내용 생성자 new InputSource() new InputSource(Reader characterstream) new InputSource(InputStream bytestream) new InputSource(String systemid) 메소드 Reader characterstream 입력원천을문자스트림으로설정. InputStream bytestream 입력원천을바이트스트림으로설정. 문자스트림으로설정되지않은경우, 문서내용을가져오기위해사용된다. String systemid 입력원천을시스템 URI로설정. 문자스트림혹은바이트스트림으로설정되지않은경우, 문서내용을가져오기위해사용된다. 설정된 URI는문서내의상대 URI를처리하는경우에도사용된다. 43
SAX API: InputSource 클래스 String publicid 입력원천의위치정보를제공하기위한공개 URI. String encoding 입력원천이문자스트림이아닌경우, XML 문서의문자인코딩 44
SAX API: DocumentHandler 인터페이스 목적 : SAX 구문분석기가구문분석중에발생하는문서이벤트의처리기에대한인터페이스 메소드 setdocumentlocator(locator locator) : 각문서이벤트처리메쏘드내에서문서의현재위치를알아내기위한 locator를알려준다. 이인터페이스의모든다른메쏘드가호출되기전에호출된다. startdocument() throws SAXException : XML 문서시작시에 1번호출된다. enddocument() throws SAXException : XML 문서마지막에 1번호출된다. startelement(string name, AttributeList atts) throws SAXException : XML 문서의구성요소시작시마다호출되어, 요소타입이름과애트리뷰트를알린다. 지정된애트리뷰트및디폴트애트리뷰트를알려주나함축된애트리뷰트 (#IMPLIED) 는알려주지않는다. endelement(string name) throws SAXException : XML 문서요소마지막마다호출된다. 45
SAX API: DocumentHandler 인터페이스 characters(char ch[], int start, int length) throws SAXException : 일련의문자데이타를알린다. 여러번으로나뉘어호출될수있다. ignorablewhitespace(char ch[], int start, int length) throws SAXException : 무시될수있는일련의공백류문자 (whitespace) 를알린다. 여러번으로나뉘어호출될수있다. 검증구문분석기는반드시호출하나, 비검증구문분석기는호출하지않을수도있다. processinginstruction(string target, String data) throws SAXException : XML 선언혹은 XML 텍스트선언을알린다. 46
SAX API: Locator 인터페이스 목적 : XML 문서의현재위치를알아내기위한인터페이스 이들메쏘드는 DocumentHandler 인터페이스의메쏘드내에서만호출되어야한다. 메소드 String getpublicid() : 현재문서이벤트의공개 URI. String getsystemid() : 현재문서이벤트의시스템 URI. int getlinenumber() : 현재문서이벤트가종료하는행번호. 알려지지않은경우에는 -1 int getcolumnnumber() : 현재문서이벤트가종료하는열번호. 알려지지않은경우에는 -1 47
SAX API: org.xml.sax.helpers.locatorimpl 클래스 implements Locator 목적 : Locator 객체의저장 생성자 new LocatorImpl() new LocatorImpl(Locator locator) : locator 와동일한내용을갖는객체생성. 메소드 setpublicid(string publicid) setsystemid(string systemid) setlinenumber(int linenumber) setcolumnnumber(int columnnumber) 48
SAX API: AttributeList 인터페이스 목적 : 문서요소의애트리뷰트들 메소드 int getlength() 애트리뷰트갯수 String getname(int i) i 번째애트리뷰트의이름 String gettype(int i) i 번째애트리뷰트의자료형. "CDATA", "ID", "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES", "NOTATION" 중하나. String getvalue(int i) : i번째애트리뷰트의값. String gettype(string name) String getvalue(string name) 49
SAX API: org.xml.sax.helpers.attributelistimpl 클래스 implements AttributeList 목적 : AttributeList 의저장 메소드 new AttributeListImpl() new AttributeListImpl(AttributeList atts) : atts와동일한내용을갖는객체생성. setattributelist(attributelist atts) addattribute(string name, String type, String value) removeattribute(string name) clear() 50
SAX API: ErrorHandler 인터페이스 목적 : SAX 구문분석기가구문분석중에발생하는오류이벤트처리기에대한인터페이스 메소드 warning(saxparseexception exception) throws SAXException error(saxparseexception exception) throws SAXException 구문분석이계속하여진행될수있는회복가능한오류의알림. fatalerror(saxparseexception exception) throws SAXException 구문분석을정상적으로완료할수없는치명적오류의알림. 51
SAX API: DTDHandler 인터페이스 목적 : SAX 구문분석기가구문분석중에발생하는 DTD 이벤트처리기에대한인터페이스 표기선언및구문분석되지않는개체선언을선언순서와관계없이호출하여알려준다. 모든이벤트가 DocumentHandler 의 startdocument, startelement 사이에발생한다. 메소드 notationdecl(string name, String publicid, String systemid) throws SAXException 표기선언의알림. unparsedentitydecl(string name, String publicid, String systemid, String notationname) throws SAXException 구문분석되지않는개체선언의알림 52
SAX API: EntityResolver 인터페이스 목적 : SAX 구문분석기가구문분석중에외부개체처리의커스터마이즈화 외부개체의 InputSource 를다른 InputSource 로대체한다. 시스템 URI 가처리되기곤란한 URI ( 데이타베이스등 ) 인경우데이타를가져와서 InputSource 로제공하거나, URI 리다이렉트 (redirect) 등에유용하다. 메소드 InputSource resolveentity(string publicid, String systemid) throws SAXException, IOException 모든종류의외부개체 ( 외부문서타입정의, 외부개체, 매개변수외부개체 ) 를포함시킬때마다호출된다. null 을반환하면구문분석기는본래의 InputSource 를사용한다. 53
SAX API: HandlerBase 클래스 목적 : SAX 이벤트처리기의편리한작성 이클래스는다음각인터페이스를다음과같이동작하도록구현한다. DocumentHandler 인터페이스 ErrorHandler 인터페이스 : 경고, 회복가능한오류는무시하고, 치명적오류의경우에는해당 SAXParseException 예외발생. DTDHandler 인터페이스 : DTD 이벤트를무시한다. EntityResolver 인터페이스 : InputSource로 null을반환한다. 54
javax.xml.parsers 패키지 JAXP API (1) SAX, DOM 구문분석기 API 사용을위한표준화된 API 제공 SAXParserFactory 추상클래스 목적 : SAX 구문분석기객체의환경설정및생성 SAXParserFactory SAXParserFactory.newInstance() 시스템프로퍼티 javax.xml.parsers.saxparserfactory 로지정된팩토리클래스객체생성. 시스템프로퍼티가지정되지않은경우디폴트로내장된팩토리클래스객체생성. SAXParser newsaxparser() throws ParserConfigurationException, SAXException boolean validating 생성될 SAX 구문분석기의검증용구문분석기여부 boolean namespaceaware 생성될 SAX 구문분석기의 XML 이름공간지원여부 55
SAXParser 추상클래스 JAXP API (2) 목적 : org.xml.sax.parser 클래스의포장 (wrapping) 클래스 boolean isvalidating() boolean isnamespaceaware() org.xml.sax.parser getparser() throws SAXException 본래의 SAX 구문분석기구현객체 parse(java.io.inputstream is, HandlerBase hb) throws SAXException, java.io.ioexception parse(java.lang.string uri, HandlerBase hb) throws SAXException, java.io.ioexception parse(java.io.file f, HandlerBase hb) throws SAXException, java.io.ioexception parse(inputsource is, HandlerBase hb) throws SAXException, java.io.ioexception 56
JAXP API (3) DocumentBuilderFactory 추상클래스 목적 : SAX 구문분석기객체의환경설정및생성 DocumentBuilderFactory DocumentBuilderFactory.newInstance() 시스템프로퍼티 javax.xml.parsers.documentbuilderfactory 로지정된팩토리클래스객체생성. 시스템프로퍼티가지정되지않은경우디폴트로내장된팩토리클래스객체생성. DocumentBulder newdocumentbuilder() throws ParserConfigurationException boolean validating 생성될 DOM 구문분석기의검증용구문분석기여부 boolean namespaceaware 생성될 DOM 구문분석기의 XML 이름공간지원여부 57
DocumentBuilder 추상클래스 JAXP API (4) 목적 : XML 문서로부터 DOM 트리객체생성 boolean isvalidating() boolean isnamespaceaware() setentityresolver(entityresolver resolver) seterrorhandler(errorhandler handler) Document newdocument() Document parse(java.io.inputstream is) throws SAXException, java.io.ioexception Document parse(java.lang.string uri) throws SAXException, java.io.ioexception Document parse(java.io.file f) throws SAXException, java.io.ioexception Document parse(inputsource is) throws SAXException, java.io.ioexception 58
JAXP API (5) JAXP 1.0 SAX 구문분석기실행예 C:\example\xml> set classpath=.;c:\jaxp1.0\jaxp.jar;c:\jaxp1.0\parser.jar C:\example\xml> java SAXTest -v intro.xml... ( 문서위치설정 )<?xml version="1.0" encoding="euc-kr"?> ( 문서시작 )( 외부개체 : null file:/home/dtkim/research/java/notes/example/xml/seminar.dtd)<seminar>( 시작 ) ( 공백류 )<title>( 시작 )XML 문서처리 ( 문자 )</title>( 끝 ) ( 공백류 )<author>( 시작 ) 김덕태 ( 문자 )</author>( 끝 ) ( 공백류 )<section>( 시작 ) ( 공백류 )<head>( 시작 )XML 문법의기초 ( 문자 )</head>( 끝 ) ( 공백류 )<itemize>( 시작 ) ( 공백류 )<item>( 시작 ) XML 문서내에다음과같은 XML 특수기호를사용하기위해서는개체참조를이용하거나, ( 문자 )<example>( 시작 ) System.out.println(1 ( 문자 )<( 문자 ) 2); System.out.println(true ( 문자 )&( 문자 )&( 문자 ) false) ( 문자 )</example>( 끝 ) ( 문자 )</item>( 끝 ) ( 공백류 )<item>( 시작 ) CDATA 섹션을이용하거나, ( 문자 )<example>( 시작 ) System.out.println(1 < 2); System.out.println(true && false) ( 문자 ) ( 문자 )</example>( 끝 ) 59
( 문자 )</item>( 끝 ) ( 공백류 )<item>( 시작 ) 처리기응용의처리에맡긴다. ( 문자 )<examplefile file="xml\test.java">( 시작 )</examplefile>( 끝 ) ( 문자 )</item>( 끝 ) ( 공백류 )<item>( 시작 ) `가 ' 대신문자참조 `( 문자 ) 가 ( 문자 )' 라고표현할수있다. ( 문자 )</item>( 끝 ) ( 공백류 )</itemize>( 끝 ) ( 공백류 )</section>( 끝 ) ( 공백류 )</seminar>( 끝 )( 문서끝 ) 60
C:\example\xml> java SAXTest -v entity_test.xml ( 문서위치설정 )<?xml version="1.0" encoding="euc-kr"?> ( 문서시작 )( 외부개체 : null file:/home/dtkim/research/java/notes/example/xml/seminar.dtd)<seminar> ( 공백류 )<title>( 시작 )XML 개체처리 ( 문자 )</title>( 끝 ) ( 공백류 )<author>( 시작 ) 김덕태 ( 문자 )</author>( 끝 ) ( 공백류 )<section>( 시작 ) ( 공백류 )<head>( 시작 ) 개체의의미 ( 문자 )</head>( 끝 ) ( 공백류 )<itemize>( 시작 ) ( 공백류 )<item>( 시작 ) 개체의내용은요소, 문자데이타, CDATA 섹션들로이루어진내용으로정의될수있다. ( 문자 )</item>( 끝 ) ( 공백류 )</itemize>( 끝 ) ( 공백류 )</section>( 끝 ) ( 공백류 )( 외부개체 : null file:/home/dtkim/research/java/notes/example/xml/section2.xml) ( 공백류 )<section>( 시작 ) ( 공백류 )<head>( 시작 ) 외부개체정의 ( 문자 )</head>( 끝 ) ( 공백류 )<itemize>( 시작 ) ( 공백류 )<item>( 시작 ) 이와같이외부에정의된개체를개체참조를통하여포함시킬수있다. ( 문자 )</item>( 끝 ) ( 공백류 )</itemize>( 끝 ) ( 공백류 )</section>( 끝 ) ( 공백류 )</seminar>( 끝 )( 문서끝 ) 61
XML for Java 3.0.1 의 SAX 구문분석기실행예 C:\example\xml> set classpath=.;c:\xml4j_3_0_1\xerces.jar C:\example\xml> java SAXTest2 org.apache.xerces.parsers.saxparser intro.xml... 62
import javax.xml.parsers.*; import org.xml.sax.*; import java.io.*; // Usage: java SAXTest [-v -n] <xml file> [output encoding] [-nodebug] public class SAXTest implements DocumentHandler, ErrorHandler, DTDHandler, EntityResolver { public static void main(string[] args) throws Exception { try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating(false); factory.setnamespaceaware(false); int i = 0; for (; args[i].startswith("-"); i++) { if (args[i].equals("-v")) factory.setvalidating(true); else if (args[i].equals("-n")) factory.setnamespaceaware(true); } String xmlfile = args[i++]; String outencoding = "euc-kr"; if (i < args.length) outencoding = args[i++]; SAXTest app = new SAXTest(outEncoding); if (i < args.length) app.debug = false; 63
// XML 문서내용설정 File file = new File(xmlFile); // InputSource input = new InputSource(file.toURL().toString()); // tourl() 은 JDK 1.2 메쏘드이므로, 다음과같이한다. String path = file.getabsolutepath(); path.replace(file.separatorchar, '/'); if (path.length() > 0 && path.charat(0)!= '/') path = '/' + path; input = new InputSource("file:" + path); } // XML 구문분석기생성 SAXParser jaxparser = factory.newsaxparser(); Parser parser = ParserFactory.makeParser(parserClass); parser.setdocumenthandler(app); parser.seterrorhandler(app); parser.setdtdhandler(app); parser.setentityresolver(app); parser.parse(input); } catch (SAXParseException ex) { System.err.println("==> 오류 : " + ex.getsystemid() + ":" + ex.getlinenumber() + ":" + ex.getmessage()); ex.printstacktrace(system.err); } catch (SAXException ex) { System.err.println("==> 오류 : " + ex.getmessage()); ex.printstacktrace(system.err); } 64
String outencoding; PrintWriter writer; Locator locator; boolean debug = true; public SAXTest(String outencoding) throws UnsupportedEncodingException { this.outencoding = outencoding; writer = new PrintWriter( new OutputStreamWriter(System.out, outencoding)); } void print(string msg) { writer.print(msg); } void print(char[] buf, int offset, int len) { writer.write(buf, offset, len); } void println(string msg) { writer.println(msg); } void printstatus(string msg) { if (debug) { writer.print("(" + msg + ")"); writer.flush(); } } 65
// DocumentHandler 인터페이스메쏘드 public void setdocumentlocator(locator loc) { this.locator = loc; printstatus(" 문서위치설정 "); } public void startdocument() throws SAXException { println("<?xml version=\"1.0\" encoding=\"" + outencoding + "\"?>"); printstatus(" 문서시작 "); } public void enddocument() throws SAXException { printstatus(" 문서끝 "); println(""); writer.flush(); } public void startelement(string name, AttributeList attrs) throws SAXException { print("<" + name); } if (attrs!= null) for (int i = 0; i < attrs.getlength(); i++) print(" " + attrs.getname(i) + "=\"" + attrs.getvalue(i) + "\""); print(">"); printstatus(" 시작 "); 66
public void endelement(string name) throws SAXException { print("</" + name + ">"); printstatus(" 끝 "); } public void characters(char[] buf, int offset, int len) throws SAXException { print(buf, offset, len); printstatus(" 문자 "); } public void ignorablewhitespace(char buf [], int offset, int len) throws SAXException { print(buf, offset, len); printstatus(" 공백류 "); } public void processinginstruction(string target, String data) throws SAXException { print("<?" + target + " " + data + "?>"); printstatus(" 처리기명령 "); } 67
// ErrorHandler 인터페이스메쏘드 public void warning(saxparseexception ex) throws SAXParseException { if (writer!= null) writer.flush(); System.err.println("==> 경고 : " + ex.getsystemid() + ":" + ex.getlinenumber() + ":" + ex.getmessage()); } public void error(saxparseexception ex) throws SAXParseException { if (writer!= null) writer.flush(); System.err.println("==> 오류 : " + ex.getsystemid() + ":" + ex.getlinenumber() + ":" + ex.getmessage()); } public void fatalerror(saxparseexception ex) throws SAXParseException { if (writer!= null) writer.flush(); System.err.println("==> 치명적오류 : " + ex.getsystemid() + ":" + ex.getlinenumber() + ":" + ex.getmessage()); } 68
// DTDHandler 인터페이스메쏘드 public void notationdecl(string name, String publicid, String systemid) throws SAXException { printstatus(" 표기선언 : " + publicid + " " + systemid); } public void unparsedentitydecl( String name, String publicid, String systemid, String notationname) throws SAXException { println("<!entity " + name + " " + publicid + " " + systemid + " NDATA " + notationname); printstatus(" 구문분석되지않는개체 "); } // EntityResolver 인터페이스메쏘드 } public InputSource resolveentity(string publicid, String systemid) throws SAXException, IOException { printstatus(" 외부개체 : " + publicid + " " + systemid); return null; } 69
문서객체모델 (DOM) XML, HTML 문서 1. 구문분석웹브라우저, XML, HTML 구문분석기, 기타프로그램 2. 생성 3. 동적인제어 DOM 모델 <--------------- 자바, 자바스크립트, IDL (C++,...) 웹브라우저로출력, XML, HTML 문서생성 목적 : XML 및 HTML 문서의동적인변경및제어를위한플랫폼및언어독립적인표준 XML 문서의구조를메모리내에서나무구조로표현하기위한문서객체모델표준의일종 용도 : 브라우저등에서출력되는문서의동적인변경및상호작용, XML, HTML 문서편집기 홈페이지 : http://www.w3.org/dom/ XML DOM 구문분석기는 XML 문서를구문분석하여, DOM 모델로변환한다. 70
문서객체모델 (DOM) (2) 종류 Document Object Model (Core) Level 1 XML 문서의 DOM 모델 필수적으로구현되어야하는기본 API 와선택적으로구현할수있는확장 API 로나뉘어진다. Document Object Model (HTML) Level 1 HTML 문서의 DOM 모델 DOM (Core) Level 1 의기본 API 를포함하고 HTML 의표현에편리한 API 가추가되어있다. 자바, 자바스크립트 (ECMA Script), 코바 IDL 에대한표준 API 가정의되어있다. ( 코바 IDL 은다양한언어에서의표준 API 를간단히정의하기위해그문법을차용한것뿐임 ) DOM 객체의생성 XML, HTML 문서로부터 DOM 구문분석기를통한 DOM 객체생성 XML 및 HTML 문서로부터웹브라우저에의한생성기타프로그램의필요에따른생성 71
문서객체모델 (DOM) (3) DOM 모델의일반적인구조 문서내용을개념상여러개의나무구조로표현한다. 나무구조의각노드는 Node 인터페이스의객체로구성된다. 나무구조의루트노드는 Document 인터페이스의객체이다. 72
자바 DOM (Core) Level 1 API (1) org.w3c.dom 패키지. 예외클래스를제외하고인터페이스만이정의되어있다. 인터페이스계층도 Node +-- Document +-- Element +-- Attr +-- CharacterData +-- Text +-- CDATASection +-- Comment +-- EntityReference +-- ProcessingInstruction +-- DocumentFragment +-- DocumentType +-- Entity +-- Notation RuntimeException DOMException 73
DOM 모델의구조 자바 DOM (Core) Level 1 API (2) Document ------> DocumentType ---> Entity, Notation,... / \ / \... Comment Element ------> Attr,... / \ Element Text EntityReference / \ Text CDATASection DOMImplementation 인터페이스 목적 : 특정 DOM 구현패키지의정보검색 boolean hasfeature(string feature, String version) DOM 구현패키지가주어진기능을제공하면 true. feature 의값으로 "XML" 혹은 "HTML" 을사용할수있고, version 의값으로 Level 1 에대해서는 "1.0" 으로표현한다. 74
Node 인터페이스 자바 DOM (Core) Level 1 API (3) 목적 : 모든노드의최상위인터페이스 short getnodetype() 노드의타입. 각하위인터페이스노드에대하여다음과같은상수가정의되어있다. DOCUMENT_NODE, DOCUMENT_FRAGMENT_NODE, ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE, NOTATION_NODE, PROCESSING_INSTRUCTION_NODE, DOCUMENT_TYPE_NODE String getnodename() : 노드의이름 ( 태그이름등 ) String nodevalue <-> throws DOMException NamedNodeMap getattributes() Node getparentnode() NodeList getchildnodes() boolean haschildnodes() 75
자바 DOM (Core) Level 1 API (4) Node getfirstchild() Node getlastchild() Node getprevioussibling() Node getnextsibling() Document getownerdocument() Node insertbefore(node newchild, Node refchild) throws DOMException Node appendchild(node newchild) throws DOMException Node removechild(node oldchild) throws DOMException Node replacechild(node newchild, Node oldchild) throws DOMException Node clonenode(boolean deep) NamedNodeMap 인터페이스 목적 : 이름으로검색할수있는노드목록 int getlength() Node getnameditem(string name) Node setnameditem(node arg) throws DOMException Node removenameditem(string name) throws DOMException Node item(int index) 76
자바 DOM (Core) Level 1 API (5) NodeList 인터페이스 목적 : 자식노드들을순서대로나타내기위한노드목록 int getlength() Node item(int index) Document 인터페이스 목적 : 단일문서모델내에포함될노드객체생성및검색이객체의생성을위한표준 API가정해져있지않으므로, 각구현에따라정해진방법을사용하여생성하여야한다. DOMImplementation getimplementation() DocumentType getdoctype() Element getdocumentelement() NodeList getelementsbytagname(string tagname) 문서내의주어진이름을갖는모든노드목록 Element createelement(string tagname) throws DOMException Attr createattribute(string name) throws DOMException DocumentFragment createdocumentfragment() Text createtextnode(string data) 77
자바 DOM (Core) Level 1 API (6) Comment createcomment(string data) CDATASection createcdatasection(string data) throws DOMException ProcessingInstruction createprocessinginstruction(string target, String data) throws DOMException EntityReference createentityreference(string name) throws DOMException Element 인터페이스 목적 : 문서의요소 ( 태그 ) 노드 String gettagname() String getattribute(string name) setattribute(string name, String value) Attr getattributenode(string name) Attr setattributenode(attr newattr) removeattribute(string name) Attr removeattributenode(attr oldattr) NodeList getelementsbytagname(string name) 주어진태그이름을갖는모든후손 Element 노드목록 normalize() 인접한모든 Text 노드를하나의 Text 노드로병합한다. 78
Attr 인터페이스 자바 DOM (Core) Level 1 API (7) 목적 : Element 노드의애트리뷰트 부모, 형제노드를갖지않는다. 자식노드로 Text, EntityReference 노드를가질수있다. String getname() boolean getspecified() 이애트리뷰트가 Element 노드와함께명시적으로값이지정된경우에 true String getvalue() setvalue(string value) CharacterData 인터페이스 목적 : 문자데이타노드 (Text, Comment) 의공통상위인터페이스 int getlength() String getdata() throws DOMException setdata(string data) throws DOMException insertdata(int offset, String arg) throws DOMException 79
자바 DOM (Core) Level 1 API (8) String substringdata(int offset, int count) throws DOMException appenddata(string arg) throws DOMException deletedata(int offset, int count) throws DOMException replacedata(int offset, int count, String arg) throws DOMException Text 인터페이스 목적 : 일반문자데이타노드 Text splittext(int offset) throws DOMException 2 개의 Text 노드로분리시켜이노드의다음형제노드로추가. CDATASection 인터페이스 목적 : Text 노드의 data 속성을나타내는 CDATA 섹션 CDATA 섹션은마크업명령을무시하며, CDATA 의마지막에오는 "]]>" 문자열만이유일한구분자로해석된다. Comment 인터페이스 목적 : 문서주석을나타내는노드 EntityReference 인터페이스 목적 : Entitty 노드로의참조노드 80
자바 DOM (Core) Level 1 API (9) ProcessingInstruction 인터페이스 String gettarget() setdata(string data) throws DOMException String getdata() DocumentFragment 인터페이스 목적 : 문서의부분 DocumentType 인터페이스 목적 : 문서타입정의 (Document Type Definition) 를나타내는노드의인터페이스 String getname() NamedNodeMap getentities() NamedNodeMap getnotations() Entity 인터페이스 목적 : 문서타입정의의 ( 구문분석된혹은안된 ) 개체부모노드를갖지않는다. String getnotationname() String getpublicid() String getsystemid() 81
자바 DOM (Core) Level 1 API (10) Notation 인터페이스 목적 : 구문분석되지않은개체에대한형식및 ProcessingInstruction 노드의타겟선언 부모노드를갖지않는다. String getpublicid() String getsystemid() DOMException 클래스 extends RuntimeException 82
XML DOM 자바구문분석기실행예 JAXP 1.0 DOM 구문분석기실행예 C:\example\xml> set classpath=.;c:\jaxp1.0\jaxp.jar;c:\jaxp1.0\parser.jar C:\example\xml> java DOMTest -v intro.xml {Document:{Element:<seminar>{Text: {Element:<title>{Text:XML 문서처리 {Text: {Element:<author>{Text: 김덕태 {Text: {Element:<section>{Text: {Element:<head>{Text:XML 문법의기초 {Text: {Element:<itemize>{Text: {Element:<item>{Text: XML 문서내에다음과같은 XML 특수기호를사용하기위해서는개체참조를이용하거나, {Element:<example>{Text: System.out.println(1 < 2); System.out.println(true && false) {Text: {Text: {Element:<item>{Text: CDATA 섹션을이용하거나, {Element:<example>{CDATASection: System.out.println(1 < 2); System.out.println(true && false) 83
{Text: {Text: {Text: {Element:<item>{Text: 처리기응용의처리에맡긴다. {Element:<examplefile>{Text: {Text: {Element:<item>{Text: ` 가 ' 대신문자참조 ` 가 ' 라고표현할수있다. {Text: {Text: {Text: {Comment: XML 예제화일주석예 {Element:<seminar>{Text: {Element:<title>{Text:XML 문서처리 {Text: {Element:<author>{Text: 김덕태 {Text: {Element:<section>{Text: {Element:<head>{Text:XML 문법의기초 {Text: {Element:<itemize>{Text: {Element:<item>{Text: XML 문서내에다음과같은 XML 특수기호를사용하기위해서는개체참조를이용하거나, {Element:<example>{Text: System.out.println(1 < 2); System.out.println(true && false) {Text: {Text: {Element:<item>{Text: CDATA 섹션을이용하거나, 84
{Element:<example>{CDATASection: System.out.println(1 < 2); System.out.println(true && false) {Text: {Text: {Text: {Element:<item>{Text: 처리기응용의처리에맡긴다. {Element:<examplefile>{Text: {Text: {Element:<item>{Text: ` 가 ' 대신문자참조 ` 가 ' 라고표현할수있다. {Text: {Text: {Text: 85
Docuverse DOM SDK 1.0A5 DOM 구문분석기실행예 C:\example\xml> set classpath=.;c:\domsdk_a5\domsdk.jar ;c:\domsdk_a5\w3cdom1.jar;c:\jaxp1.0\jaxp.jar;c:\jaxp1.0\parser.jar C:\example\xml> java DOMTest -Djavax.xml.parsers.DocumentBuilderFactory =com.docuverse.dom.documentbuilderfactoryimpl -v intro.xml... IBM XML Parser for Java 3.0.1 DOM 구문분석기실행예 C:\example\xml> set classpath=.;c:\xml4j_3_0_1\xerces.jar;c:\jaxp1.0\jaxp.jar C:\example\xml> java -Djavax.xml.parsers.DocumentBuilderFactory =IBMDocumentBuilderFactoryImpl DOMTest -v intro.xml... 86
import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; public class DOMTest { public static void main(string[] args) throws Exception { // XML 문서내용설정 File file = new File(args[2]); // input = new InputSource(file.toURL().toString()); // tourl() 은 JDK 1.2 메쏘드이므로, 다음과같이한다. String path = file.getabsolutepath(); path.replace(file.separatorchar, '/'); if (path.length() > 0 && path.charat(0)!= '/') path = '/' + path; InputSource input = new InputSource("file:" + path); Document doc = DOMFactory.openDocument(args[0], args[1], input); } print(doc); public static void print(node node) { if (node == null) return; int type = node.getnodetype(); 87
switch(type) { case Node.DOCUMENT_NODE: print((document) node); break; case Node.DOCUMENT_FRAGMENT_NODE: print((documentfragment) node); break; case Node.ELEMENT_NODE: print((element) node); break; case Node.ATTRIBUTE_NODE: //print((attribute) node); break; case Node.TEXT_NODE: print((text) node); break; case Node.CDATA_SECTION_NODE: print((cdatasection) node); break; case Node.COMMENT_NODE: print((comment) node); break; case Node.ENTITY_NODE: //print((entity) node); break; case Node.ENTITY_REFERENCE_NODE: //print((entityreference) node); break; 88
} case Node.NOTATION_NODE: //print((notation) node); break; case Node.PROCESSING_INSTRUCTION_NODE: //print((processinginstruction) node); break; case Node.DOCUMENT_TYPE_NODE: //print((documenttype) node); } public static void print(nodelist nodelist) { int num = nodelist.getlength(); for (int i = 0; i < num; i++) { Node node = nodelist.item(i); print(node); } } public static void print(document doc) { print("{document:"); DocumentType doctype = doc.getdoctype(); Element root = doc.getdocumentelement(); print(doctype); print(root); print(doc.getchildnodes()); print("}"); } 89
public static void print(documenttype doctype) { if (doctype == null) return; print("{documenttype:"); print(doctype.getnodename()); //print(doctype.getname()); //NamedNodeMap entities = doctype.getentities(); //NamedNodeMap notations = doctype.getnotations(); //print(entities); //print(notations); print(doctype.getchildnodes()); print("}"); } public static void print(element elem) { print("{element:"); print("<" + elem.gettagname() + ">"); print(elem.getchildnodes()); print("}"); } public static void print(text text) { print("{text:"); print(text.getdata()); print(text.getchildnodes()); print("}"); } 90
public static void print(cdatasection cdata) { print("{cdatasection:"); print(cdata.getdata()); print(cdata.getchildnodes()); print("}"); } public static void print(comment comment) { print("{comment:"); print(comment.getdata()); print(comment.getchildnodes()); print("}"); } } public static void print(string val) { System.out.print(val); } 91
자바 DOM (HTML) Level 1 API org.w3c.dom.html 패키지. HTML 문서의각요소 ( 태그 ) 종류에대하여 org.w3c.dom 패키지의하위인터페이스가정의되어있다. DOM (HTML) 을지원하는 XML 자바 DOM 구문분석기로 HTML 문서를구문분석하여 DOM (HTML) 객체모델을생성할수있다. 92
XHTML (1) 명세문서 http://www.w3.org/tr/xhtml1/ MIME 타입 : text/html, text/xml, application/xml XHTML 1.0 규격 HTML 4.0 문서규격을 XML 문서규격을만족하도록수정한문서규격 Strict, Transitional, Frameset 등 3 가지문서규격중한가지를만족시켜야한다. 루트요소는 <html> 이어야한다. 루트요소의 xmlns 속성으로 XHTML 1.0 이름공간인 http://www.w3.org/1999/xhtml 을지정한다. 루트요소이전에다음중하나의 DTD 를포함시켜야한다. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN "DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN "DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN "DTD/xhtml1-frameset.dtd"> 93
XHTML (2) <a>, <applet>, <form>, <frame>, <iframe>, <img>, <map> 요소의요소식별자로 name 속성대신에 id 속성사용 HTML 과 XML 문서규격을동시에만족하는문서를만들수있다. 요소이름과속성이름은모두소문자이어야한다. 예 : xhtml.html <?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko"> <head> <meta http-equiv="content-type" content='text/html; charset="euc-kr"' /> <title>xhtml 소개 </title> </head> <body> XHTML 1.0 은 HTML 4.0 문서규격을 XML 문서규격을만족하도록수정한문서규격이다. </body> </html> 94
XHTML (3) XHTML 문서에다른규격의 XML 문서를포함시킬수있다. ( 단, 현재로서는 XHTML 규격을엄격히따르는문서가아님 ) 예 : xhtml-xmlns.html <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>a Math Example</title> </head> <body> <p>the following is MathML markup:</p> <math xmlns="http://www.w3.org/1998/math/mathml"> <apply> <log/> <logbase> <cn> 3 </cn> </logbase> <ci> x </ci> </apply> </math> </body> </html> 95
XHTML(4) 다른규격의 XML 문서에 XHTML 문서조각을포함시킬수있다. 예 : xhtml-xmlns2.html <?xml version="1.0" encoding="utf-8"?> <!-- initially, the default namespace is "books" --> <book xmlns='urn:loc.gov:books' xmlns:isbn='urn:isbn:0-395-36341-6' xml:lang="en" lang="en"> <title>cheaper by the Dozen</title> <isbn:number>1568491379</isbn:number> <notes> <!-- make HTML the default namespace for a hypertext commentary --> <p xmlns='http://www.w3.org/1999/xhtml'> This is also available <a href="http://www.w3.org/">online</a>. </p> </notes> </book> 96
XHTML(5) Tidy HTML 문서를 XHTML 문서로변환해주는도구 http://www.w3.org/people/raggett/tidy/ 예제 : untidy.html <html> <head> <title>test</title> </head> <body> <H1>Heading 1</H1> <p>this is a paragraph. <ul> <li> item 1 <li> item 2 </ul> </body> </html> 97
XHTML(6) 실행예 C:\example\xml> set CLASSPATH=c:\tools\xml\JTidy\lib\Tidy.jar C:\example\xml> java org.w3c.tidy.tidy -asxml untidy.html <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta name="generator" content="html Tidy, see www.w3.org" /> <title>test</title> </head> <body> <h1>heading 1</h1> <p>this is a paragraph.</p> <ul> <li>item 1</li> <li>item 2</li> </ul> </body> </html> 98
XML 문서의 HTML 변환표시방법 정적인변환 MSXSL XML과 XSL을결합해서 HTML 문서를생성하는툴 http://www.microsoft.com/xml/xsl/downloads/msxsl.asp 동적인변환 서버측혹은클라이언트측에서수행될수있다. MSXSL 명령행유틸리티액티브X 컨트롤자바애플릿자바스크립트 99
스타일시트 정의 문서가어떤방식으로표시될것인지를규정하는규칙들의집합 종류 XSL (extensible Markup Language) CSS (Cascading Style Sheet) DSSSL 장점 문서의내용과표시방법의분리를통한문서의명료화 다운로드시간, 네트워크체증, 서버부담감소 동일문서를목적에따라다양한방식으로표현가능 하나의스타일시트를변경시킴으로써이스타일시트를따른모든문서의 일괄적인변경 특징 XSL, CSS는 XML에적용될수있다. CSS는 HTML에적용가능하나, XSL은그렇지않다. XSL은문서변환기술언어로도사용될수있으나CSS는그렇지않다. CSS 문서는 XSL 문서로변환될수있다. 100
XML 문서에스타일시트명시 (1) XML 문서에스타일시트명시명세문서 http://www.w3.org/tr/xml-stylesheet/ XML 문서에 xml-stylesheet 처리기명령으로 XSL, CSS 등의스타일시트를명시할수있다. 예 ) <?xml-stylesheet href="mystyle.css" type="text/css"?> xml-stylesheet 처리기명령의애트리뷰트 href CDATA #REQUIRED type CDATA #REQUIRED title CDATA #IMPLIED media CDATA #IMPLIED charset CDATA #IMPLIED alternate (yes no) "no 101
XML 문서에스타일시트명시 (2) XML 문서에 CSS 명시예 : intro-css.xml <?xml version="1.0" encoding="euc-kr"?> <?xml-stylesheet href="seminar.css" type="text/css"?> <!DOCTYPE seminar SYSTEM "seminar.dtd">... 예제 CSS 스타일시트 : seminar.css seminar {display: block; font-size: 14pt; background-color: white; color: black; } title {display: block; font-size: 32pt; font-weight: bold; text-align: center} author {display: block; text-align: left; font-size} section {display: block;} head {display: block; font-size: 24pt; font-weight: bold; text-align: center} itemize {display: block;} item {display: list-item; list-style-type: circle;} example {display: block; white-space: pre; border: 1pt solid;} examplefile {display: block} 102
XSL XSL: Extensible Stylesheet Language 목적 : XML 문서를표시정보를갖는 XML 문서타입으로변환하기위한스타일시트언어 XSL 은다음 2 가지의독립적인언어로구성된 XML 문서이다. 변환언어 (XSLT): 하나의 XML 문서를다른 XML 문서로변환 포매팅언어 XSL 문서자체는 XML 문서의일종이다. XSL 명세문서 : http://www.w3.org/style/xsl/ 단점 XSL 은 HTML 등과같이 XML 문법을갖는문서로만변환할수있다. 정교한포매팅은곤란하다. XSL 에스크립트언어를사용하거나, XSL 을사용하는대신 XML 처리기응용을구현하여표시하거나, XSL 로변환된문서를별도의 XML 처리기응용으로표시하여해결될수있다. 103
XSL Transformations (XSLT) XSL 규격의일부 XML 문서 ( 소스트리 ) 를다른 XML 문서 ( 결과트리 ) 로의변환을기술하기위한 XML 문서의일종 MIME 타입 : text/xml, application/xml XSL Transformations (XSLT) Version 1.0 명세문서 http://www.w3.org/tr/xslt XML Path Language (XPath) http://www.w3.org/tr/xpath XSLT 이름공간 URI: http://www.w3.org/1999/xsl/transform 이름공간프리픽스로 `xml: 을사용하는것이관례. 루트요소는 <xsl:stylesheet> 혹은 <xsl:transform> 사용 104
XSL 처리기 목적 : XML 문서와 XSL 문서를구문분석하여변환된 XML 문서생성 XSL 처리기 LotusXSL http://www.alphaworks.ibm.com/formula/lotusxsl XSLP http://www.clc-marketing.com/xslp/ James Clark 의 XT http://www.jclark.com/xml/xt.html LotusXSL 의실행예 실행후의출력파일 out.html 을웹브라우저로방문한다. c:\example\xml> set CLASSPATH=c:\lotusxsl_1_0_0\xalan.jar;c:\lotusxsl_1_0_0\xerces.jar c:\example\xml> java org.apache.xalan.xslt.process in intro.xml -xsl seminar2html.xml > out.html 105
예제 : seminar2html.xml <?xml version="1.0" encoding="euc-kr"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/seminar"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title><xsl:value-of select="title"/></title> </head> <body> <h1 style="text-align: center;"><xsl:value-of select="title"/></h1> <p> 저자 : <xsl:value-of select="author"/></p> <hr /> <xsl:apply-templates select="section"/> </body> </html> </xsl:template> 106
<xsl:template match="section"> <xsl:apply-templates/> <hr /> </xsl:template> <xsl:template match="head"> <h2 style="text-align: center;"><xsl:value-of select="."/></h2> </xsl:template> <xsl:template match="itemize"> <ul> <xsl:apply-templates/> </ul> </xsl:template> <xsl:template match="item"> <li><xsl:apply-templates/></li> </xsl:template> 107
<xsl:template match="example"> <!-- <p style="border: 1pt solid; padding: 1ex; white-space: pre; font-family: monospace;"> --> <pre style="white-space: pre; border: 1pt solid;"><xsl:value-of select="."/></pre> </xsl:template> <xsl:template match="examplefile"> <p> 예제 ) <a> <xsl:attribute name="href"><xsl:value-of select="translate(@file, '\', '/')"/> </xsl:attribute><xsl:value-of select="@file"/></a></p> </xsl:template> </xsl:stylesheet> 108
XSL 포매팅언어 XSL 포매팅객체변환기 FOP: A Formatting Object to PDF Translator http://www.jtauber.com/fop/ XSL 문서는특정문서타입의 XML 문서를요소나무구조를결과나무구조로변환한후, 결과나무구조를목적 XML 문서로변환하기위한변환규칙을정의한다. 109
리소스 XML 홈페이지 : http://www.w3.org/xml/ XML 사이트 : http://www.xml.com/xml/pub XML 사이트 : http://www.oasis-open.org/cover/sgml-xml.html XML S/W 모음 : http://www.xmlsoftware.com/ XML 관련정보 : http://www.datachannel.com/ SGML/XML 홈페이지 : http://www.sil.org/sgml/ XML FAQ: http://xml.t2000.co.kr/faq/index.html XML 뉴스그룹 : news:comp.text.xml XML 사이트 : http://developerlife.com/ ``XML Bible, Elliotte Rusty Harold, IDG Books Worldwide, 1999 ``Professional XML Applications, Frank Boumphrey 외 11 인, 류광역, 정보문화사, 1999 XML 메일링리스트아카이브 http://www.lists.ic.ac.uk/hypermail/xml-dev XML FAQ: http://www.ucc.ie/xml 110