1. DTD 개요
ㅁ DTD (Document Type Definition)
- 새로운 마크업 언어를 정의 -> 문서/데이터의 구조를 정의
- XML 문서에서 사용가능한 markup들의 집합과 사용 규칙을 정의
● 엘리먼트( + 속성 ) , 개체(entity), 노테이션(notation) 등
ㅁ 문서의 유효성
- 특정 DTD에 따라 작성된 문서를 그 DTD에 대해 유효한 문서라 함
- DTD를 이용해 XML 문서가 유효한 문서인지 확인 가능 (유효성검사)
2. DTD 사용 방법
ㅁ 문서 유형 선언(Document type declaration : DOCTYPE)
- xml 문서가 어떤 DTD에 의해 (정의된 언어로) 작성된 것인지 문서 내에 명시
- DTD는 내부 DTD subset ( : 서두 안에 선언 ) 과 외부 DTD subset으로 구별됨
- 외부 DTD subset를 정의한 문서를 DTD 문서라
● 내부 DTD Subset
▶ 마크업 언어에 대한 DTD가 XML 문서 내부에서 정의됨
▶ 주로 외부 DTD subset의 일부 내용을 XML문서에서 재정의해 사용할 목적으로 이용
● 외부 DTD Subset
▶ 마크업 언어에 대한 DTD가 별도의 문서(파일)로 정의 됨 (여러 XML문서에서 공통적으로 사용 가능)
▶ 새로운 마크업 언어를 정의 -> 새로운 외부 DTD subset을 작성
▶ DTD 문서(파일)은 확장자로 "dtd"사용
+) XML 문서의 유효성 검사
● XML 문서 작성 시 유효성(validation) 검사 실시
- XML editor에 내장된 기능 사용
● XML 문서 이용 시 유효성 검사 실시
- 응용프로그램이 XML 문서를 처리하기 전에 유효성 검사 실시
- XML parser의 유효성 검사 기능 이용
ex) MSXML parser , DOM/SAX parser
3. DTD 구성요소
• 엘리먼트(element) 선언 • 노테이션(notation) 선언
- 예: <IELEMENT 이름 (#PCDATA)> - 예: <NOTATION gif SYSTEM "gifviewer. exe">
• 속성(attribute) 선언 • 조건부 색션(conditional section) 선언
- 예: <!ATTLIST 학생 학년 (1|2|3|4)> - 예: <!I[NCLUDE [<!ELEMENT 전화 (집, 사무실)>]]>
• 개체(entity) 선언 • 주석(comment)
_ 예: <!ENTITY 학교 “동덕여자대학교"> - 예:<! DTD 주석 >
ㅁ 엘리먼트 선언
˚ 엘리먼트(element) : XML 문서를 구성하는 논리적 단위
˚ 선언 형식
<!ELEMENT 엘리먼트명 contents>
- 엘리먼트명 : XML 엘리먼트의 이름
- contents: XML 엘리먼트의 구조(데이터 타입) 정의
-> contents model 또는 contents category 정의
ㅁ Contents 유형
- Contents model
▷ #PCDATA : 일반적인 문자 데이터(text)만을 포함
▷ children : 자식 엘리먼트 (child element)들을 포함
▷ mixed : 문자 데이터와 자식 엘리먼트들을 함께 포함
- Contents category
▷ empty : 내용을 갖지 않는 빈 엘리먼트 선언
▷ any : 임의의 구조(타입)의 데이터를 포함할 수 있음
● 문자 데이터(text) 선언
<!ELEMENT 엘리먼트명 (#PCDATA)>
+) PCDATA: XML parser가 해석하는 문자 데이터
● 자식 엘리먼트 선언
: 상위(부모) 엘리먼트에 포함되는 하위 엘리먼트 선언
<!ELEMENT 엘리먼트명 (child1,child2,child3,...,childn)>
※ 주의 : 괄호 안에 포함된 자식 엘리먼트들도 DTD에서 각각 별도의 엘리먼트 선언을 해야함
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
DTD 문서
<book>
<title> XML Foundation </title>
<author> 신인철 </author>
</bookr>
XML 문서
※ 주의 : <title>과 <author> 엘리먼트의 사용 순서가 바뀌면 안됨
ㅇ 자식 엘리먼들의 표현 방법
: 자식 엘리먼트들의 순서나 반복 횟수를 지정하기 위해 여러 가지 선언자 기호 사용
선언자 기호 | 설명 |
, | 선언된 엘리먼트들을 순서대로 자식 엘리먼트로 사용 // 리스트 연산자 |
| | 선언된 엘리먼트들 중 하나만 선택해서 자식 엘리먼트로 사용 // 선택 연산자 |
( ) | 선언된 엘리먼트들을 하나의 그룹으로 선언 |
* | 선언된 엘리먼트가 0번 이상 사용될 수 있음 (0~n) // no or unlimited |
+ | 선언된 엘리먼트가 1번 이상 사용될 수 있음 (1~n) // one or unlimited |
? | 선언된 엘리먼트가 0번 또는 1번 사용될 수 있음 (0~1) // zero or only one |
무기호 | 특별한 기호가 없으면 선언된 엘리먼트를 반드시 한번만 사용 |
● 혼합형(mixed) 선언
: 엘리먼트의 content로 문자 데이터와 자식 엘리먼트를 동시에 선언할 때 사용
<!ELEMENT 엘리먼트명 (#PCDATA|child1|child2|...|childn)*>
- 주의 사항
⊙ 문자데이터(#PCDATA)를 먼저 선언
⊙ 혼합 내용의 반복성은 0번 이상(*)으로 정의
<!ELEMENT p(#PCDATA|a|ul|b|i|em)* >
------------------------------------
<p>
Oh~ <em>Hello</em> <b>world</b>
</p>
● EMPTY 선언
- Content를 갖지 않는 빈 엘리먼트를 정의하기 위해 사용
◎ 빈 엘리먼트의 경우 content가 없으므로 일반적으로 속성을 가짐
- 형식
<!ELEMENT 엘리먼트명 EMPTY>
- 엘리먼트 사용 방법
◎ <엘리먼트명></엘리먼트명> 또는 <엘리먼트명 />
※ 주의 : 시작태그와 종료 태그 사이에 공백이 있으면 안 됨
- 예
<!ELEMNET 학번 EMPTY>
<!ELEMNET 이름 EMPTY>
--------------------------
<학번></학번>
<이름/>
● ANY 선언
- 엘리먼트의 content에 대해 조건을 두지 않을 경우에 사용
◎ 정의되는 엘리먼트는 임의의 구조를 가질 수 있음
√ DTD 내에 선언된 모든 엘리먼트들을 자식 엘리먼트로 가질 수 있음
◎ ANY content 유형은 XML 문서 처리를 위한 응용프로그램 개발을 어렵게 만들기 때문에 잘 사용되지 않음
- 형식
<!ELEMENT 엘리먼트명 ANY>
ㅁ 속성 선언
˚ 속성은 엘리먼트에 부가적인 정보를 제공함
˚ 엘리먼트와 관련된 속성 이름, 속성 유형, 속성 기본값 등을 정의
<!ATTLIST 엘리먼트명
속성명1 속성유형 속성기본값
속성명2 속성유형 속성기본값 ...>
- 엘리먼트명, 속성명 : XML 문서에서 선언된 엘리먼트 이름을 명시한 후 그 엘리먼트에 적용될 속성이름 지정
√ XML 권고안의 XML 이름 작성 규칙을 따름
√ 하나의 엘리먼트에 같은 이름의 속성을 여러 개 선언할 수 없음
- 속성 유형 : 열거형, 문자열 , 토큰 타입
- 속성기본값 : 속성의 초기 값, #FIXED, #IMPLIED, #REQUIRED
<?xml version="1.0" encoding="UTF-8"?>
<!--엘리먼트 선언-->
<!ELEMENT booklist(book*)>
<!ELEMENT book(title, author)>
<!ELEMENT title(#PCDATA)>
<!ELEMENT author(#PCDATA)>
<!--속성 선언-->
<!ATTLIST book kind CDATA #REQUIRED>
▲DTD 문서 c4_1101.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE booklist SYSTEM "c4_1101.dtd">
<booklist>
<book kind="소설">
<title>시인과 도둑</title>
<author>이문열</author>
</book>
</booklist>
▲XML 문서 c4_1101.xml
● 속성 기본값(디폴트 선언)
- 엘리먼트 작성시 속성을 생략할 수 있는지 , 반드시 기술해야하는지 등을 지정
- 속성이 생략될 때 속성이 갖는 디폴트 값 지정 가능
값 | 의미 |
#REQUIRED | 속성을 반드시 기술해야함 |
#IMPLIED | 속성을 생략 가능 |
#FIXED value | 속성의 값을 미리 지정(값 변경 불가) |
value | 속성이 생략될 때 생략될 때 사용될 default값 지정 |
▽사용 예
형식 | <!ATTLIST 엘리먼트명 속성명 속성유형 #REQUIRED> |
DTD문서 | <!ATTLIST book kind CDATA #REQUIRED> |
XML문서 | <book>~</book> (오류) |
형식 | <!ATTLIST 엘리먼트명 속성명 속성유형 #IMPLIED> |
DTD문서 | <!ATTLIST book kind CDATA #IMPLIED> |
XML문서 | <book>~</book> (kind 속성 생략) |
형식 | <!ATTLIST 엘리먼트명 속성명 속성유형 #FIXED "고정값"> |
DTD문서 | <!ATTLIST book kind CDATA #REQUIRED nation CDATA #FIXED "국내"> |
XML문서 | <book kind="소설"> ~ </book> (nation="국내") <book kind="소설" nation="국내"> ~ </book> <book kind="소설" nation="해외"> ~ </book> (오류) |
형식 | <!ATTLIST 엘리먼트명 속성명 속성유형 "디폴트값"> |
DTD문서 | <!ATTLIST book kind CDATA #REQUIRED nation CDATA "국내"> |
XML문서 | <book kind="소설"> ~ </book> (nation="국내") <book kind="소설" nation="해외"> ~ </book> |
● 속성 유형
˚ 문자열 타입(CDATA) : 임의의 문자열을 속성 값으로 가짐
˚ 열거형 타입 : 열거된 여러 값들 중 하나를 속성 값으로 가짐
˚ 토큰 타입 : 다음과 같은 키워드를 사용하여 속성 값 유형을 정의
속성 유형 | 설명 |
ID | 속성값은 엘리먼트를 구별하기 위한 식별자로 사용되며, XML 문서 내에서 유일한 값을 가져야함 |
IDREF/ IDREFS |
속성값은 XML 문서 내에서 ID 속성으로 사용된 값만 사용 가능 다음 엘리먼트의 ID 속성값을 참조하기 위해 사용됨 |
NMTOKEN/ NMTOKENS |
속성값은 XML 이름 작성 규칙을 준서하는 문자데이터만 사용 가능 |
NOTATION | 속성값은 DTD에 명시적으로 선언된 notation명만 사용 가능 |
ENTITY/ ENTITIES |
속성값은 DTD에 명시적으로 선언된 entity명만 사용 가능 |
ㅁ 문자열 타입(CDATA)
- 속성 값에 대해 <, >, &, ' , " 등과 같은 특수문자 제외하고 어떤 문자열도 사용 가능
- 특수문자를 사용할 때는 개체 참조 이용
≫ < > & ' " 등
- 예
ㅁ 열거형 타입
- DTD에 열거된 값들 중에서 하나를 선택하여 사용하도록 함
˚ 괄호 안에 나열된 값 이외의 값은 사용 불가
- 예
ㅁ ID 타입
- XML 문서에서 엘리먼트들을 유일하게 식별해야할 경우 사용
- 예
- ※ 주의 사항
▷ 속성기본값은 #IMPLIED 또는 #REQUIRED만 사용가능
▷ 각 엘리먼트에서 ID 타입 속성은 하나만 정의 가능
▷ 문서 내에서 ID타입 속성의 값은 중복될 수 없음
▷ ID 타입 속성의 값은 반드시 XML 이름 작성 규칙을 따라야 함
∨예 : 반드시 문자(letter)로 시작, 특수기호 사용 제한
ㅁ IDREF(S) 타입
- ID 타입으로 선언된 속성이 갖는 값들 중 하나를 가짐
º IDREF(S) 타입 속성의 값은 문서 내에 포함된 ID 속성 값들 중에 일치(참조)하는 것이 반드시 있어야함
- 형식
º 속성기본값은 #IMPLIED 또는 #REQUIRED만 사용 가능
- IDREFS : ID 타입으로 선언된 속성 값들 중 여러 개를 동시에 참조 가능
º 속성값들은 공백 문자로 구분
- 예
● 개체(ENTITY) 선언
ㅁ 개체의 개념
- XML 문서를 구성하는 물리적 저장 단위(storage unit)
- 종류
○ 문서 entity : 일반적인 XML 문서 ○ 외부 일반 parsed entity
○ 외부 DTD subset entity : DTD 문서 ○ 외부 일반 unparsed entity
○ 빌트인(built-in) entity : XML에 미리 정의된 문서 ○ 내부 파라미터(parameter) entity
○ 내부 일반 parsed entity ○ 외부 파라미터(parameter) entity
ㅁ 개체의 사용 목적
- XML 문서에서 구성요소의 공유 및 재사용
ㅁ 개체 분류
- 물리적 저장 단위에 따른 구분
구분 | 물리적 저장 단위 |
내부(internal) | 같은 DTD 내에 정의 |
외부(external) | 별도의 파일(XML/DTD 문서)로 정의 |
- 참조되는 위치에 따른 구분
구분 | 참조되는 곳 |
일반(general) | XML 문서에서 참조하여 사용 |
파라미터(parameter) | DTD 문서에서 참조하여 사용 |
- XML parser가 해석 가능한지 여부에 따른 구분
● 일반 개체만 해당됨
구분 | 개체 내용 |
Parsed | XML parser가 해석할 수 있는 내용으로 구성 |
UnParsed | XML parser가 해석할 수 없는 비-문자 데이터로 구성 |
ㅁ 빌트인(built-in) entity
- 미리 정의되어 있는 개체
XML 문서에서 참조 방법 | 치환될 문자 | 의미 |
< | < | less-than |
> | > | greater-than |
& | & | ampersand |
" | " | double-quote |
' | ' | sigle-quote |
- 사용 예
XML 문서 | <ex1> XML & JAVA </ex1> -> XML & JAVA <ex2>x < y</ex2> -> x <y <ex3 attr="<xml> /> -> "<xml>" |
ㅁ 내부 일반 parsed entity
- DTD 내에서 문자 데이터로 선언되고, 별도의 물리적인 파일 형태 갖지 않음 (내부, parsed)
- XML 문서에서 참조 (일반)
ㅁ 외부 일반 parsed entity
- XML 문서에서 자주 사용되는 엘리먼트들을 별도의 물리적인 파일로 저장한 것 (외부, parsed)
- XML 문서에서 참조 (일반)
ㅁ 외부 일반 unparsed entity
- 비-문자 데이터로 이루어진 물리적인 저장 단위를 참조
⊙ 음악 파일, 그림 파일, 동영상 파일 등
- 선언 (DTD 문서)
⊙ Notation과 외부 일반 unparsed entity 선언
⊙ 엘리먼트에 대해 ENTITY 타입의 속성 선언
- 참조 (XML 문서)
⊙ ENTITY 타입 속성으로 외부 일반 unparsed entity의 이름을 지정(참조)
ㅁ 내부 파라미터(parameter) entity
- DTD 내용의 일부를 DTD 문서 내에서 참조하기 위해 선언
- DTD 내에서 선언되고 참조되기 때문에 선언되는 위치는 반드시 참조되기 전에 와야함
ㅁ 외부 파라미터(parameter) entity
- DTD 내용의 일부를 DTD 문서와 다른 물리적인 저장 단위로 저장한 것
- 여러 DTD 문서들에서 공통적으로 사용되는 부분을 별도의 파일로 저장하고 , 외부 파라미터 entity를 선언후 각 DTD문서에서 참조하여 이용
ㅁ parameter entity 사용 예
● Notation 선언
ㅁ Notation 선언과 사용
- 그림, 동영상, 음악 등 이진(binary) 파일의 포맷(format)을 식별
ˇ MIME type 이용 (예: text/html, image/jpeg, video/mpeg)
- XML parser가 해석할 수 없는 비-문자 데이터의 포맷과,
데이터를 처리할 응용 프로그램(helper application)을 지정
1) NOTATION 타입의 속성 값으로 사용
- Notation명을 속성 값으로 사용
<!ATTLIST 엘리먼트명 속성명
NOTATION (notation명1|notation명2|...) "기본값선언">
※ 주의 사항 ※
> EMPTY 엘리먼트는 NOTATION 타입의 속성을 가질 수 없음
> 각 엘리먼트는 NOTATION 타입의 속성을 최대 하나만 가질 수 있음
2. 외부 일반 unparsed entity의 포맷을 지정하기 위해 사용
- 외부 일반 unparsed entity를 정의하기 위해서는 그 entity가 어떤 포맷으로 저장되어 있는지를 선언해야함
<!ENTITY entity명 SYSTEM "entity 파일의 경로" NDATA notaion명>
● 조건부 Section 선언
ㅁ 조건부 Section 선언과 사용
- DTD 문서 내부에서 어떤 조건에 따라 DTD의 내용을 포함하거나 포함하지 않도록 하기 위해 사용
- 조건부 Section 선언 형식
ㅇ INCLUDE 키워드로 정의한 부분은 유효성 검사 대상
ㅇ IGNORE 키워드로 정의한 부분은 XML parser가 읽기는
하지만 유효성 검사에서 제외
- 사용예
● DTD 사용 예 : Book Markup Language
ㅁ 마크업 언어 개발 절차
(1) 어떤 목적으로 마크업 언어를 개발할 것인가?
참고도서
- 신민철, Java 개발자를 위한 XML, 프리렉, 2006.
- 홍성용, XML 원리와 응용, 한빛아카데미, 2014.
- 정인용, 자바스크립트+제이쿼리 입문, 이지스퍼블리싱, 2014.
– Brett McLaughlin/박영록 역, Head Rush Ajax, 한빛미디어, 2006.
- Kirupa Chinnathambi/이태상 역, 리액트 웹앱 제작 총론, 2/e, 2019.
– Alex Banks/오현석 역, 러닝 리액트, 2/e, 한빛미디어, 2021