XML 응용 프로그래밍 5장 DTD 순천향대학교 컴퓨터공학과 2016. 9. 26 하 상 호
DTD란? 문서의 구조에 대한 형식적 정의 기술 DTD는 다음 사항을 기술 요소명으로 사용될 수 있는 것이 무엇인지? 특정 요소가 몇 번 반복될 수 있는지 또는 반복되어야 하는지? 동일 수준에 나타나는 요소들간의 순서는 무엇인지? 요소들이 어떻게 중첩되는지? 특정 요소에 사용될 수 있는, 또는 사용되어야 하는 속성들이 있는지? 그렇다면, 무엇인지? DTD는 문서 내부에 기술되거나 외부에 기술될 수 있다.
예제: DTD 첫번째 요소(weather-forecast)는 루트 다른 요소(today, tomorrow, long-range)는 weather-forecast의 자식 요 소이며, 나열된 순서가 문서에 나타나는 순서임 이러한 요소들이 포함하는 데이터의 타입(PCDATA)을 정의 <!ELEMENT weather-forecast (today, tomorrow, long-range)> <!ELEMENT today (#PCDATA)> <!ELEMENT tomorrow (#PCDATA)> <!ELEMENT long-range (#PCDATA)>
유효한/유효하지 않은 문서 4 invalid valid invalid <!ELEMENT weather-forecast (today, tomorrow, long-range)> <!ELEMENT today (#PCDATA)> <!ELEMENT tomorrow (#PCDATA)> <!ELEMENT long-range (#PCDATA)> <?xml version="1.0"?> <weather-forecast> <today> rain </today> <tomorrow> showers </tomorrow> <long-range> unsettled </long-range> </weather-forecast> <?xml version="1.0"?> <weather-forecast> <today> Rain </today> <tomorrow> Showers </tomorrow> </weather-forecast> <?xml version="1.0"?> <weather-forecast> <today> Rain </today> <long-range> Unsettled </long-range> <tomorrow> Showers </tomorrow> </weather-forecast> invalid valid invalid 4
문서 내부에 DTD 포함 DTD를 문서 내부에 표현 가능 DTD 표현 형식 DTD는 문서의 프롤로그 상에 표현됨 문서의 프롤로그는 선언, 주석, 처리명령어들로 구성 프롤로그 이후에 문서 내용이 작성 DTD 표현 형식 DTD는 DOCTYPE 선언 내부에 표현 ‘rootelement’는 문서의 루트 요소 <!DOCTYPE rootelement[…DTD here..]>
예제: 문서 내부에 DTD 포함 문서가 DTD를 포함하고 있음을 나타냄 <?xml version="1.0" standalone="yes"?> <!DOCTYPE weather-forecast[ <!ELEMENT weather-forecast (today, tomorrow, long-range)> <!ELEMENT today (#PCDATA)> <!ELEMENT tomorrow (#PCDATA)> <!ELEMENT long-range (#PCDATA)> ]> <weather-forecast> <today>Rain</today> <tomorrow>Showers</tomorrow> <long-range>Unsettled</long-range> </weather-forecast>
XML 문서 유효성 검증 브라우저는 XML 문서의 유효성을 자동으로 검증하지 않으며, 이를 위해서 XMLSpy와 같은 도구가 필요. 문서가 well-formed 되어 있는지 검사 주어진 DTD(또는 XML Schema)에 대해서 유효한지 검증
XMLSpy 사용법(1) new 파일 생성 ‘File’ 메뉴를 클릭 ‘New’ 선택
XMLSpy 사용법(2) new 파일 생성 원하는 파일 타입을 선택 ‘ok’ 클릭
XMLSpy 사용법(3) XML 문서 작성 문서 유효성 검증을 위해 DTD나 XML Schema를 선택 그렇지 않으면 ‘Cancel’ 클릭
XMLSpy 사용법(4) XML 문서 작성 DTD 연결시 forecast.dtd
XMLSpy 사용법(5) XML 문서 작성 후 외부 DTD 연결 ‘DTD/Schema’ 선택 ‘Assign DTD’ 클릭
XMLSpy 사용법(6) XML 문서 유효성 검증 ‘XML’ 선택 ‘Validate XML 클릭
문서 외부 DTD DTD는 XML 문서와 별개 파일로 작성 <?xml version="1.0" standalone="no"?> <!DOCTYPE weather-forecast SYSTEM "forecast.dtd"> <weather-forecast> <today> Rain </today> <tomorrow> Showers </tomorrow> <long-range> Unsettled </long-range> </weather-forecast>
문서 외부 DTD DTD와 문서를 별개 파일로 작성하며, 동일한 DTD가 여러 문서 를 검증하는데 사용 가능 validate tuesday-weather.xml validate forecast.dtd monday-weather.xml validate validate wednesday-weather.xml sunday-weather.xml validate validate validate thursday-weather.xml saturday-weather.xml friday-weather.xml
DTD 유형 DTD는 SYSTEM 혹은 PUBLIC SYSTEM DTD는 응용에 맞게 내부적으로 작성된 DTD 해당 파일은 여러분의 지역 시스템에 존재(URL이나 파일 경로로 표현) PUBLIC DTD는 공통 문서 타입 명세 여러 응용에서 사용 전역적으로 알려진 식별자가 존재 예: HTML 문서에 대한 DTD
PUBLIC DTD PUBLIC DTD 식별자는 URL이 아닌 FDI(Formal Public Identifier) 형식으로 표현 FDI 형식: ‘owner//keyword description //language’ ‘language’는 문서가 아닌 DTD에 연관 Ex. HTML 4.01의 public dtd PUBLIC DTD는 SYSTEM 대체 요소도 반드시 표현해야 함 Public dtd가 발견되지 않을 경우에 이 대체 요소가 사용됨 -//W3C//DTD HTML 4.01//EN Owner keyword description language <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN“ "http://www.w3.org/TR/html4/strict.dtd">
외부 DTD 포함 문서 SYSTEM DTD(문서 타입) 이용 <?xml version="1.0" standalone="no"?> <!DOCTYPE weather-forecast SYSTEM "forecast.dtd"> <weather-forecast> <today> Rain </today> <tomorrow> Showers </tomorrow> <long-range> Unsettled </long-range> </weather-forecast>
DTD 구성 DTD 구성 요소 DTD 문서 형식 요소 선언 속성 선언 개체 선언 내부 DTD: 외부 DTD: [!DOCTYPE root_element[internal DTD]> [!DOCTYPE root_element source location1 location2> DTD 문서 정의 키워드 루트 요소 SYSTEM/PUBLIC 키워드 DTD 파일 위치
DTD 요소 선언 (1) 일반 형식: 정규식은 요소의 타입(요소가 사용될 수 있는 방식)을 기술 #PCDATA 자식 요소 포함 #PCDATA로 정의된 요소는 자식 요소 포함 불가 <!ELEMENT name (regular-expression)> <!ELEMENT today (#PCDATA)> <!ELEMENT weather-forecast (today, tomorrow, long-range)> weather-forecast의 자식들
DTD 요소 선언 (2) 자식 요소 선언 <!ELEMENT element_name (child_1, child_2, child_3, ...., child_n)>
DTD 요소 선언 (3) 자식 요소 선언 <!ELEMENT element_name (child_1, child_2, child_3, ...., child_n)> <!DOCTYPE 학생정보 [ <!ELEMENT 학생정보(학번, 이름, 나이, 이메일, 주소지, 전화)> <!ELEMENT 학번(#PCDATA)> <!ELEMENT 이름(#PCDATA)> <!ELEMENT 나이(#PCDATA)> <!ELEMENT 이메일(#PCDATA)> <!ELEMENT 주소지(주소, 우편번호)> <!ELEMENT 주소(#PCDATA)> <!ELEMENT 우편번호(#PCDATA)> <!ELEMENT 전화(#PCDATA)> ]>
DTD 요소 선언 (4) 일반 형식: 정규식 상에 ‘,’로 구분된 요소는 나열된 순서대로 태그가 나타나야 함을 기술 ‘|’는 ‘or‘를 의미: 해당 태그들이 나타날 수 있음을 의미 ‘*’는 ‘zero or more’를 의미 <!ELEMENT name (regular-expression)> <!ELEMENT qualification (certificate, diploma, degree)> <!ELEMENT certificate (#PCDATA)> <!ELEMENT diploma (#PCDATA)> <!ELEMENT degree (#PCDATA)> qualification 요소는 certificate, diploma, degree 요소를 순서대로 포함함 <!ELEMENT qualification (certificate | diploma | degree) > qualification 요소는 certificate, diploma, degree 요소 중에서 어느 하나를 포함함 <!ELEMENT qualifications (qualification*)> qualifications 요소는 0개 이상의 qualification 요소를 포함함
DTD 요소 선언 (5) 일반 형식: ‘+’는 ‘one or more’를 의미 ‘?’는 선택(0 or 1)을 의미 EMPTY 요소 이러한 태그는 내용을 포함하지 않음 보통 속성을 가짐 <!ELEMENT name (regular-expression)> <!ELEMENT qualifications (qualification+)> <!ELEMENT qualifications (qualification+, higher-qualification?)> <!ELEMENT higher-qualification EMPTY>
DTD 요소 선언 (6) 자식 요소 기술시 사용 기호 선언자 기호 설명 , 선언한 요소의 순서대로 자식 요소를 사용 | , 선언한 요소의 순서대로 자식 요소를 사용 | 앞 또는 뒤의 요소를 사용 ( ) 요소를 그룹으로 선언해서 정의 * 선언한 요소를 0번 이상 사용할 수 있음(0~n) + 선언한 요소를 1번 이상 사용할 수 있음(1~n) ? 선언한 요소를 0번 또는 1번 사용할 수 있음(0~1)
DTD 요소 선언 (7) 자식 요소 기술 예 요소 사용 설명 A A라는 요소를 1번 정의하여 사용 A,B (A,B,C) A, B, C 요소를 순차적으로 1번씩 사용 A, (B|C)+ A 요소를 먼저 사용하고, B 또는 C 요소를 1번 이상 사용 A, (B|C)* A 요소를 먼저 사용하고, B 또는 C 요소를 0번 이상 사용
예제: DTD <!DOCTYPE 학생정보[ <!ELEMENT 학생정보 (학생)+ > <!ELEMENT 학생 (학번?, 이름*)> <!ELEMENT 학번 (#PCDATA)> <!ELEMENT 이름 (#PCDATA)> ]> <학생정보> <학생> <학번> S100 </학번> <이름> 고소영 </이름> </학생> <학번> S200 </학번> <이름> 구미호 </이름> </학생정보>
예제: DTD 다음 DTD가 기술하는 문서의 구조는? <!ELEMENT qualifications (qualification+, higher-qualification?, institution+)> <!ELEMENT qualification (year, (certificate | diploma | degree)) > <!ELEMENT higher-qualification EMPTY> <!ELEMENT year (#PCDATA)> <!ELEMENT certificate (#PCDATA)> <!ELEMENT diploma (#PCDATA)> <!ELEMENT degree (#PCDATA)> <!ELEMENT institution (name)> <!ELEMENT name (#PCDATA)>
예제: DTD 포함 문서 다음 문서는 유효한가? <!ELEMENT qualifications (qualification+, higher-qualification?, institution+)> <!ELEMENT qualification (year, (certificate | diploma | degree)) > <!ELEMENT higher-qualification EMPTY> <!ELEMENT year (#PCDATA)> <!ELEMENT certificate (#PCDATA)> <!ELEMENT diploma (#PCDATA)> <!ELEMENT degree (#PCDATA)> <!ELEMENT institution (name)> <!ELEMENT name (#PCDATA)> <?xml version='1.0'?> <!DOCTYPE qualifications SYSTEM "qualifications.dtd"> <qualifications> <qualification> <year>2001</year> <diploma>Electronic Engineering</diploma> </qualification> <year>2005</year> <degree>Computer Science</degree> <higher-qualification/> <institution> <name>Oxford University</name> </institution> <name>MIT</name> </qualifications>
예제: DTD 포함 문서 다음 문서는 유효한가? <!ELEMENT qualifications (qualification+, higher-qualification?, institution+)> <!ELEMENT qualification (year, (certificate | diploma | degree)) > <!ELEMENT higher-qualification EMPTY> <!ELEMENT year (#PCDATA)> <!ELEMENT certificate (#PCDATA)> <!ELEMENT diploma (#PCDATA)> <!ELEMENT degree (#PCDATA)> <!ELEMENT institution (name)> <!ELEMENT name (#PCDATA)> <?xml version='1.0'?> <!DOCTYPE qualifications SYSTEM "qualifications.dtd"> <qualifications> <qualification> <year>1999</year> <certificate>Baking</certificate> </qualification > <institution> <name>Springfield College</name> </institution> </qualifications>
DTD 요소 선언 (8) 요소에 데이터와 자식 요소를 동시에 선언 가능
DTD 요소 선언 (9) ANY 선언 형식: 요소는 모든 데이터(PCDATA, CDATA, 자식 요소, 주석)을 포함 가능 <!ELEMENT element_name ANY>
요소 vs. 속성 언제 속성을 사용할 것인가? 데이터에 대한 부가 정보 제공 디폴트 값 정의 고정된 값(상수) 정의 유효한 값들의 집합 정의 요소에 유일한 ID 설정 (요소간의 참조 제공)
DTD 속성 선언 요소의 속성 리스트 선언 ‘element’는 DTD에 정의된 요소 ‘attribute-specification’은 ‘name type value’의 형식을 가짐 ‘name’은 속성 이름이며, 속성 선언에 단지 한번 나타날 수 있다. 다른 요소에 동일한 속성 이름이 사용 가능 속성 이름은 요소 이름과는 다르게 DTD에서 유일할 필요가 없다 <!ATTLIST element attribute-specification … attribute-specification>
속성 타입 (1) 가장 공통된 속성 타입은 CDATA 형식: 속성 값으로 Character data가 사용 <, >, &, ‘,’같은 특수 문자를 제외한 어떤 문자열도 가능(특수 문자는 개체 참조 문자를 이용) 속성 값은 파싱되지 않음 <!ATTLIST 요소이름 속성이름 CDATA 속성기본값> 속성 타입
속성 키워드 속성 키워드는 속성 값이 반드시 요구되는지(required), 선택적 인지(implied), 상수 값인지(fixed)를 명세 #REQUIRED (compulsory) #IMPLIED (optional) #FIXED (constant value) <!ATTLIST higher-qualification type CDATA #REQUIRED> <!ATTLIST qualification internationally-recognised CDATA #IMPLIED> 36 <!ATTLIST company name CDATA #FIXED "WebHomeCover.com">
속성 키워드 (2) 예제 <!ELEMENT institution (name, location)> <!ATTLIST institution is-university CDATA #REQUIRED> <!ELEMENT name (#PCDATA)>
속성 타입 (2) CDATA로 선언되지 않은 속성은 디폴트 값, 열거 타입, NMTOKEN, NMTOKENS, ID, IDREF, IDREFS 등의 타입을 가질 수 있다. 디폴트 값은 이중인용부호 안에 표현 열거 타입은 가능한 값들을 나열하고, 디폴트 값 명세 가능 <!ATTLIST qualification years-of-study "3"> <!ATTLIST institution is-university (true | false) "false"> <!ATTLIST calendar day-name (Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday) #REQUIRED>
예제: 속성 <!ELEMENT qualifications (qualification+, higher-qualification?, institution+)*> <!ELEMENT qualification (year, (certificate | diploma | degree)) > <!ATTLIST qualification level CDATA #REQUIRED internationally-recognised CDATA #IMPLIED years-of-study CDATA "3"> <!ELEMENT higher-qualification EMPTY> <!ATTLIST higher-qualification type CDATA #REQUIRED> <!ELEMENT year (#PCDATA)> <!ELEMENT certificate (#PCDATA)> <!ELEMENT diploma (#PCDATA)> <!ELEMENT degree (#PCDATA)> <!ATTLIST degree type CDATA #REQUIRED> <!ELEMENT institution (name)> <!ATTLIST institution is-university (true | false) "false"> <!ELEMENT name (#PCDATA)>
속성을 포함한 문서 <!ELEMENT qualifications (qualification+, higher-qualification?, institution+)*> <!ELEMENT qualification (year, (certificate | diploma | degree)) > <!ATTLIST qualification level CDATA #REQUIRED internationally-recognised CDATA #IMPLIED years-of-study CDATA "3"> <!ELEMENT higher-qualification EMPTY> <!ATTLIST higher-qualification type CDATA #REQUIRED> <!ELEMENT year (#PCDATA)> <!ELEMENT certificate (#PCDATA)> <!ELEMENT diploma (#PCDATA)> <!ELEMENT degree (#PCDATA)> <!ATTLIST degree type CDATA #REQUIRED> <!ELEMENT institution (name)> <!ATTLIST institution is-university (true | false) "false"> <!ELEMENT name (#PCDATA)> 다음 문서는 유효한가? <?xml version="1.0"?> <qualifications> <qualification level="3" internationally-recognised ="no"> <year>1999</year> <certificate>Baking</certificate> </qualification > <higher-qualification type="Master of Baking" /> <institution is-university="false"> <name> The McBaking Institute of Culinary Technology</name> </institution> </qualifications>
속성 타입 (3) NMTOKEN(name token) 속성 값에 포함될 수 있는 문자를 알파벳, 숫자, ., -, _, : 등으로 제한되 어 특수 문자나 공백형 문자를 포함 불가 속성 키워드는 #IMPLIED, #REQUIRED만 가능 <!ATTLIST 이름 별명 NMTOKEN # REQUIRED> <이름 별명 = “007빵”> 홍길동 </이름>
속성 타입 (4) NMTOKENS(name tokens) NMTOKEN 값들을 공백으로 구분하여 여러 개를 사용 가능 <!ATTLIST 이름 별명 NMTOKENS # REQUIRED> <이름 별명 = “007빵 _짱구”> 홍길동 </이름>
속성 타입 (5) 속성은 추가로 ID, IDREF, IDREFS 등의 타입을 가질 수 있다. 속성 키워드는 #IMPLIED, #REQUIRED만 가능 타입 설명 ID 속성 값이 문서에서 유일한 값을 가짐 IDREF 속성 값으로 문서에서 선언된 ID 값을 참조 IDREFS 속성 값으로 문서에서 선언된 여러 개의 ID 값을 참조
속성 타입: ID, IDREF, IDREFS 예제 <!ATTLIST 이름 학번 ID # REQUIRED> <!ATTLIST 학과 회장 IDREF # REQUIRED> <!ATTLIST 학과 임원 IDREFS # REQUIRED> <이름 학번 = “s100”> 홍길동 </이름> <이름 학번 = “s200”> 성춘향 </이름> <이름 학번 = “s300”> 장길산 </이름> <학과 회장=“s200”> 컴퓨터공학과</학과> <학과 임원=“s100 s300“> 컴퓨터공학과</학과>
개체(entities) 선언 DTD 내부 또는 외부에 위치한 값에 대한 참조를 정의하는데 사용 개체 이름 개체 값 개체 참조 <!ENTITY whc “WebHomeCover.com"> 개체 이름 개체 값 <company-name>&whc;</company-name> 개체 참조
개체 분류 객체 유형 설명 일반 개체 개체를 DTD에 선언하고, 문서에서 참조 파라미터 개체 내부 개체 문서 내부에 존재하는 개체 외부 개체 외부 파일에 저장된 개체(텍스트, 이미지, 사운드, 동영상 등)
예제: 일반 개체 일반 개체 정의 및 참조 형식 &개체이름; <!ENTITY 개체이름 값> <?xml version=“1.0” encoding=“utf-8”?> <!DOCTYPE students[ <!ELEMENT students (univ,student)> <!ELEMENT univ (#PCDATA)> <!ELEMENT student (sno,name,age,phone,address)> <!ELEMENT sno (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT address (#PCDATA)> <!ENTITY univ_address “서울 강남구 역삼동 대학로 한국대학교”> ]> <students> <univ> &univ_address; </univ> <student> <sno> s100 </sno> <name> 홍 민 성 </name> <age> 20 </age> <phone> 02-1299-8989 </phone> <address> 서울 강남구 신사동 119번지 </address> </student> </students> &개체이름;
예제: 파라미터 개체 파라미터 개체 정의 및 참조 형식 <!ENTITY % 개체이름 값> %개체이름; <?xml version=“1.0” encoding=“utf-8”?> <!ENTITY % student_list “(sno,name,age,phone,address)”> <!ELEMENT students (univ,student)> <!ELEMENT univ (#PCDATA)> <!ELEMENT student %student_list; > <!ELEMENT sno (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT address (#PCDATA)> <!ENTITY univ_address “서울 강남구 역삼동 대학로 한국대학교”> …
외부 객체 외부 객체 정의 형식 값은 외부 파일명 키워드 SYSTEM이 사용됨 <!ENTITY 개체이름 SYSTEM 값> &개체이름; <!ENTITY 증명사진 SYSTEM “pic.jpg”>
XML 문서로부터 DTD 생성(1) DTD 생성 과정 [1단계] XML 문서 수집 [2단계] XML 문서 분석 [3단계] 트리 구조 작성 [4단계] DTD 문법에 맞게 DTD 부분 작성 [5단계] 부분 DTD를 하나의 DTD로 통합 [6단계] 유효한 XML 문서인지 확인
XML 문서로부터 DTD 생성(2) 1단계: XML 문서 수집 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE movies SYSTEM "movies.dtd"> <movies> <movie> <name> 살인의 추억 </name> <company name="싸이더스"> <address> <시> 서울시 </시> <구> 동작구 </구> <동> 신대방동 </동> </address> <phone> 02-799-1234 </phone> <fax> 02-788-4321 </fax> <url href="http://www.movie.com"/> </company> <hero> 송강호 </hero> <hero> 김상경 </hero> <price unit="원"> 6,000 </price> <date> <year> 2002 </year> <month> 10 </month> <day> 28 </day> </date> </movie> <movie> <name> 자카르타 </name> <company name="연우필름"> <address> <시> 서울시 </시> <구> 강남구 </구> <동> 역삼동 </동> </address> <phone> 02-787-2989 </phone> <url/> </company> <hero> 김상중 </hero> <hero> 임창정 </hero> <price unit="원"> 7,000 </price> <date> <year> 2003 </year> <month> 02 </month> <day> 10 </day> </date> </movie> <movie> <name> 똥개 </name> <company name="진인사필름"> <address> <시> 서울시 </시> <구> 종로구 </구> <동> 내수동 </동> </address> <phone> 02-909-3746 </phone> <fax> 02-287-2938 </fax> <url/> </company> <hero> 정우성 </hero> <price unit="원"> 8,000 </price> <date> <year> 2003 </year> <month> 08 </month> <day> 11 </day> </date> </movie> </movies>
XML 문서로부터 DTD 생성(3) 2단계: XML 문서 분석 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE movies SYSTEM "movies.dtd"> <movies> <movie> <name> 살인의 추억 </name> <company name="싸이더스"> <address> <시> 서울시 </시> <구> 동작구 </구> <동> 신대방동 </동> </address> <phone> 02-799-1234 </phone> <fax> 02-788-4321 </fax> <url href="http://www.movie.com"/> </company> <hero> 송강호 </hero> <hero> 김상경 </hero> <price unit="원"> 6,000 </price> <date> <year> 2002 </year> <month> 10 </month> <day> 28 </day> </date> </movie> XML 문서로부터 DTD 생성(3) 2단계: XML 문서 분석 최상위 요소는 <movies>로 한다. <movies> 요소 안에 <movie> 요소가 여러 번 반복하여 나타날 수 있다. <movie> 요소에는 <name>, <company>, <hero>, <price>, <date>가 자식 요소로 존재한다. <name> 요소는 영화 명칭을 나타낸다. <company> 요소는 name 속성을 가지는데 그 값은 반드시 존재한다. <url> 요소는 href 속성을 가지는데 그 값은 없어도 된다. <company> 요소에는 <address>, <phone>, <fax>, <url>이 자식 요소로 존재한다. <address> 요소에는 <city>, <gu>, <dong>이 자식 요소로 존재한다. <fax> 요소는 회사에 따라서 값을 가질 수도 있다. <url> 요소 데이터는 가지지 않는다. <hero> 요소는 한 명 이상 여러 명이 올 수 있다. <price> 요소는 unit이라는 속성을 가지는데, 그 값은 항상 won이라는 단위만 올 수 있다. <date> 요소는 <year>, <month>, <day>를 자식 요소로 가진다. DTD는 외부 DTD를 만들고 XML에서 선언해서 사용한다.
XML 문서로부터 DTD 생성(4) 3단계: 트리 구조 생성 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE movies SYSTEM "movies.dtd"> <movies> <movie> <name> 살인의 추억 </name> <company name="싸이더스"> <address> <시> 서울시 </시> <구> 동작구 </구> <동> 신대방동 </동> </address> <phone> 02-799-1234 </phone> <fax> 02-788-4321 </fax> <url href="http://www.movie.com"/> </company> <hero> 송강호 </hero> <hero> 김상경 </hero> <price unit="원"> 6,000 </price> <date> <year> 2002 </year> <month> 10 </month> <day> 28 </day> </date> </movie>
XML 문서로부터 DTD 생성(5) 4단계: DTD를 부분적으로 생성(1/2) 최상위 요소는 <movies>로 한다. <movies> 요소 안에 <movie> 요소가 여러 번 반복하여 나타날 수 있다. ==> <!ELEMENT movies (movie+)> <movie> 요소에는 <name>, <company>, <hero>, <price>, <date> 자식 요소가 존재한다. ==> <!ELEMENT movie (name, company, hero+, price, date)> <name> 요소는 영화 명칭을 나타낸다. ==> <!ELEMENT name (#PCDATA)> <company> 요소는 name 속성을 가지는데 그 값은 반드시 존재한다. ==> <!ATTLIST company name CDATA #REQUIRED> <url> 요소는 href 속성을 가지는데 그 값은 없어도 된다. ==> <!ATTLIST url href CDATA #IMPLIED> <company> 요소에는 <address>, <phone>, <fax>, <url>이 자식 요소로 존재한다. ==> <!ELEMENT company (address, phone, fax?, url?)>
XML 문서로부터 DTD 생성(6) 4단계: DTD를 부분적으로 생성(2/2) <address> 요소에는 <city>, <gu>, <dong>이 자식 요소로 존재한다. ==> <!ELEMENT address (city, gu, dong)> <!ELEMENT city (#PCDATA)> <!ELEMENT gu (#PCDATA)> <!ELEMENT dong (#PCDATA)> <fax> 요소는 회사에 따라서 값을 가질 수 있다. <url> 요소 데이터는 가지지 않는다. ==> <!ELEMENT fax ANY> <!ELEMENT url EMPTY> <hero> 요소는 한 명 이상 여러 명이 올 수 있다. ==> <!ELEMENT movie (name, company, hero+, price, date)> ==> <!ELEMENT hero (#PCDATA)> <price> 요소는 unit이라는 속성을 가지는데, 그 값은 항상 won이라는 단위만 올 수 있다. ==> <!ATTLIST price unit CDATA #FIXED "won"> <date>요소는 <year>, <month>, <date>를 자식 요소로 가진다. ==> <!ELEMENT date (year, month, date)> <!ELEMENT year (#PCDATA)> <!ELEMENT month (#PCDATA)> <!ELEMENT date (#PCDATA)> DTD는 외부 DTD를 만들고 XML에서 선언해서 사용한다. ==> <!DOCTYPE movies SYSTEM "movies.dtd">
XML 문서로부터 DTD 생성(7) 5단계: 부분 DTD를 통합 <!ELEMENT movies (movie+)> <!ELEMENT movie (name, company, hero+, price, date)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (address, phone, fax?, url?)> <!ATTLIST company name CDATA #REQUIRED> <!ELEMENT address (city, gu, dong)> <!ELEMENT city (#PCDATA)> <!ELEMENT gu (#PCDATA)> <!ELEMENT dong (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT fax ANY> <!ELEMENT url EMPTY> <!ATTLIST url href CDATA #IMPLIED> <!ELEMENT hero (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST Price unit CDATA #FIXED "won"> <!ELEMENT date (year, month, year)> <!ELEMENT year (#PCDATA)> <!ELEMENT month (#PCDATA)> <!ELEMENT date (#PCDATA)>
XML 문서로부터 DTD 생성(8) 6단계: XML 문서가 유효한지 검증
DTD 자동 생성(1) XML Copy Editor의 무료 XML 편집기 이용 http://xml-copy-editor.sourceforge.net/
DTD 자동 생성(2) 새 파일 생성 ‘File’ - ‘New’ 선택 ‘XML document’ 선택 ‘OK’ 클릭
DTD 자동 생성(3) XML 문서 작성 ‘File’ – ‘Save As’ 선택 test.xml 문서로 생성
DTD 자동 생성(4) DTD 생성 ‘XML’ – ‘Create Schema’ 선택 ‘DTD’ 선택 ‘OK’ 클릭
DTD 자동 생성(4) 생성된 DTD 저장 ‘File’ – ‘Save As’ 선택 test.dtd로 생성
DTD 자동 생성(4) 작성한 XML 문서에 생성된 DTD 연결
DTD 자동 생성(4) XML 문서의 유효성 검증 ‘XML’ – ‘Validate’ – ‘DTD/XML Schema’ 선택
DTD 생성: XMLSpy 이용(1) XML 문서를 작성한 후 ‘DTD/Schema’ – ‘Generate DTD/Schema’ 선택
DTD 생성: XMLSpy 이용(2) 팝업 창에서 ‘DTD’ 선택 ‘OK’ 클릭 DTD 파일 생성 DTD 파일 이름 입력
DTD 생성: XMLSpy 이용(3) 생성된 DTD를 문서에 연결 단지 팝업 창에서 ‘예’를 선택