DTD(문서 형식 정의(Document Type Definition)는 컴퓨터 용어로, SGML 계열의 마크업 언어에서 문서 형식을 정의하는 것이다. SGML을 비롯해 HTML, XHTML, XML 따위에서 쓰인다. XML DTD는 XML 문서의 구조를 정의한다. 다시 말해서 Valid XML 문서가 되기 위해 문서 내에 어떤 요소를 사용하고, 요소간의 계층구조를 기술하고, 요소의 내용으로 올 수 있는 내용을 정의한다.


DTD는 문법이 간단하며, SGML 계열에서 사용되어 왔기에 기존의 다양한 문서 정의가 DTD로 되어 있다. 그러나 DTD가 가지고 있는 XML에서의 다양한 확장의 한계로 인하여 XML_Schema 표준을 사용할 것을 추천한다.



1. DTD 선언 방식

1.1. 외부 DTD 선언

<?xml version="1.0" ending="utf-8"?>

<!DOCTYPE 루트요소이름 SYSTEM "DTD문서경로">


SYSTEM : 시스템에 존재하는 물리적인 위치정보. 파일이름 or 특정URL

<!DOCTYPE CONCEPT SYSTEM "concept.dtd">

<!DOCTYPE CONCEPT SYSTEM "http://ddokbaro.tistory.com/xml/concept.dtd">

<!DOCTYPE CONCEPT SYSTEM "file:///c:/concept.dtd">


PUBLIC : 특수한 형태를 식별자를 사용하여 외부DTD 참조

<!DOCTYPE member PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" >


혼합방식 : SYSTEM  + PUBLIC 

<!DOCTYPE CONCEPT PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://ddokbaro.tistory.com/xml/concept.dtd" >


1.2. 내부 DTD 선언 - 실무에서 쓸일 없음.

1.3. 외부-내부 DTD 선언 - 실무에서 쓸일 없음. 




2. ELEMENT

2.1. ELEMENT 정의 형태

#PCDATA(문자 데이터) : <!ELEMENT ele-name (#PCDATA)>

자식요소 : <!ELEMENT ele-name (ele-name+, ele-name, ....)+>

자식요소와 문자 데이터의 혼합 : <!ELEMENT ele-name (#PCDATA | ele-name ....)*>

EMPTY(빈 content) : <!ELEMENT ele-name EMPTY>

ANY(위의 4가지가 모두 오는 경우) : <!ELEMENT ele-name ANY>


2.2. 출연횟수 정의


?

 0 or 1 (출현하지 않거나 1번만 출현)

 0개 이상 출현(출현하지 않거나 반복 출현가능)

+

 1개 이상 출현(무조건 1번은 출현해야되고, 여러번 반복 출현 가능)


2.3. #PCDATA(문자 데이터)

- PCDATA : Parsed Character Data 

- 출현횟수 정의 불가 : <!ELEMENT name (#PCDATA)+>  (X)


2.4. 자식요소

<!ELEMENT CONCEPT (time, place)> 

<!ELEMENT PEOPLE ( (Mr|Ms), Firstname, Middlename*, Lastname) >

<!ELEMENT PEOPLE ( email*, ( homePhone | officePhone | mobilePhone)+, address?) > 


2.5. #PCDATA + 자식요소

<!ELEMENT 요소이름 (#PCDATA|요소명1|요소명2.....)*>

#PCDATA는 반드시 자식요소보다 먼저 와야 한다.

- "|" 이외의 출현횟수나 출현방법은 괄호 밖에 정의한다.


2.6. EMPTY - 빈요소, 실무에서 사용빈도 적음

<!ELEMENT 요소명 EMPTY>


2.7. ANY - 모든사항 허용, 최대한 사용하지 말 것

<!ELEMENT 요소명 ANY>




3. Attribute

3.1. 기본형식

<!ATTLIST ele-name (att-name type default-decl)+>


ele-name : 속성이 포함될 요소의 이름

att-name : 요소 안에 포함될 속성의 이름

type : 속성값을 제한하기 위한 값으로 10가지 속성타입이 올 수 있다.

default-decl : 속성이 요소에 반드시 포함되어야 하는지 등의 특별한 제한을 두기 위하여 사용된다. => #IMPLIED, #REQUIRED, 기본값, #FIXED


3.2. att-name

- 문자 시작, 숫자 시작 불가, 공백불가, "_", ":"로 시작가능


3.3. type

 CDATA 

 문자데이터(단순한 텍스트 문자열) 

 열거형 

 속성값은 반드시 DTD에 명시적으로 정의된 일련의 값들 중의 하나가 되어야 한다. 

 ID 

 속성값은 해당 요소에서 고유한 식별자이다. 이것은 반드시 모든 XML 이름 규칙을 따르는 텍스트 문자열 이어야 한다.

 IDREF 

 IDREF의 값과 똑같은 ID 값을 갖고 있는 요소에 대한 참조 값 

 IDREFS 

 공백에 의해 경계가 나뉘는 IDREF들의 리스트 

 NMTOKEN 

 하나의 이름 토큰 - XML 이름 규칙을 따르는 텍스트 문자열 

 NMTOKENS 

 공백에 의해 경계가 나뉘는 NMTOKEN들의 리스트 

 ENTITY

 이미 정의된 ENTITY의 이름 

 ENTITIES 

 공백에 의해 경계가 나뉘는 ENTITY 이름들의 리스트 

 NOTATION

 속성값은 DTD에 명시적으로 선언된 NOTATION type이 되어야 한다. 


<!ATTLIST ele-name att-name CDATA default-decl >

<!ATTLIST elel-name att-name (value1 | value2 | .. ) default-decl >

<!ATTLIST ele-name att-name ID (#REQUIRED|#IMPLIED)>

<!ATTLIST ele-name att-name IDREF(S) default-decl>

<!ATTLIST ele-name att-name NMTOKEN(S) default-decl >



3.4. default-decl

#REQUIRED

 속성은 반드시 요소에서 사용되어야 한다. 

#IMPLIED   속성 사용이 선택적이며, 만일 사용하지 않으면 요소는 이 속성을 갖지 않는다. 기본 값은 줄 수없다. 

 #FIXED

 속성 사용은 선택적이고, 사용하지 않으면 고정 값을 기본 값으로 가지며 사용할 경우, "고정 값"을 속성 값으로 가진다. 즉 상수와 동일하다. 




4. ENTITY

- 반복적으로 사용되는 문장이나 문자열을 참조

XML조각, DTD조각, 긴 문자열, 상수, non-XML 데이터 사용가능

- 세부사항 참조 링크




5. NOTATION - 실무에서는 추천 안함

- XML 응용프로그램에서 사용할 외부 응용 프로그램이나 이진 데이터에 이름 부여

<!NOTATION not-name SYSTEM URI>

<!NOTATION not-name  PUBLIC pURI sURI>



+ Recent posts