Document Type Definition
문서/데이터의 구조를 정의
XML 문서에서 사용 가능한 markup들의 집합과 사용 규칙을 정의한다.
예시
<!ELEMENT Invoice (Header, Item+)>
<!ELEMENT Header (Date, BillTo)>
<!ATTLIST Header
invoidNumber CDATA #REQUIRED>
...
특정 DTD에 따라 작성된 문서를 그 DTD에 대해 유효한 문서(valid document)라 함
예: HTML 문서는 HTML DTD에 대해 유효한 문서
DTD를 이용하여 XML 문서가 유효한 문서인지 확인 가능하다.
Document type declaration: DOCTYPE
XML 문서가 어떤 DTD에 의해 작성된 것인지를 문서 내에 명시한다.
DTD는 내부 DTD Subset과 외부 DTD Subset으로 구별된다.
외부 DTD subset을 정의한 문서를 DTD 문서라 한다.
마크업 언어에 대한 DTD가 XML 문서 내부에서 정의됨
내부 DTD Subset은 주로 외부 DTD Subset의 일부 내용을 XML 문서에서 재정의하여 사용할 목적으로 이용된다.
마크업 언어에 대한 DTD 문서가 별도의 문서(파일)로 정의됨
따라서 여러 XML 문서에서 공통적으로 이용이 가능하다.
DTD 문서는 확장자로 .dtd
사용
<!DOCTYPE 루트 엘리먼트[
새로운 dtd 정의
]>
예
<!DOCTYPE booklist[
<!ELEMENT booklist (book+)>
<!ELEMENT book (#PCDATA)>
]>
SYSTEM
키워드와 함께 DTD 문서의 경로나 URL을 기술
국제적으로 공인되지 않은 단체에서 정의한 외부 DTD subset 문서를 지정할 경우 사용됨
형식
<!DOCTYPE 루트엘리먼트 SYSTEM "SYSTEM 식별자">
PUBLIC
키워드와 함께 사용
공개적인 사용을 목적으로 기업이나 기관에서 정의한 외부 DTD subset 문서를 지정할 경우 사용됨
PUBLIC 식별자 형식
±//DTD 개발 단체명//DTD 이름 및 버전//사용 언어
✔︎ + : 국제 공인 단체에서 정의한 DTD의 경우
✔︎ - : 비공인 단체에서 정의한 DTD인 경우
PUBLIC
식별자를 이해하지 못하는 응용 프로그램을 위해 SYSTEM
식별자를 추가하여 DTD 문서의 URL 또는 파일 경로를 지정 가능
형식
<!DOCTYPE 루트엘리먼트 PUBLIC "PUBLIC식별자">
XML 문서 작성 시 유효성 검사 실시
➡ XML editor에 내장된 기능 사용
XML 문서 이용 시 유효성 검사 실시
➡ 응용 프로그램이 XML 문서를 처리하기 전에 유효성 검사 실시
➡ XML parser의 유효성 검사 기능 이용
• 엘리먼트 (element)
• 속성 (attribute)
• 개체 (entity)
• 노테이션 (notation)
• 조건부 섹션 (conditional section)
• 주석 (comment)
XML 문서를 구성하는 논리적 단위
선언 형식
<!ELEMENT 엘리먼트명 contents>
• 엘리먼트명: XML 엘리먼트의 이름
• contents: XML 엘리먼트의 구조(데이터 타입) 정의
Contents model
• #PCDATA
: 일반적인 문자 데이터만을 포함
• children
: 자식 엘리먼트들을 포함
• mixed
: 문자 데이터와 자식 엘리먼트들을 함께 포함
형식
☛ PCDATA
<!ELEMENT 엘리먼트명 (#PCDATA)>
☛ chlidren
<!ELEMENT 엘리먼트명 (child1, child2, child3, ...)>
★ 주의 ★
괄호 안에 포함된 자식 엘리먼트들도 DTD에서 각각 별도의 엘리먼트 선언을 해야 함
Contents category
• empty
: 내용을 갖지 않는 빈 엘리먼트 선언
• any
: 임의의 구조(타입)의 데이터를 포함할 수 있음
자식 엘리먼트들의 순서나 반복 횟수를 지정하기 위해 여러 가지 선언자 기호를 사용함
선언자 기호 | 설명 |
---|---|
, | 선언된 엘리먼트들을 순서대로 자식 엘리먼트로 사용 |
| | 선언된 엘리먼트들 중 하나를 선택해서 자식 엘리먼트로 사용 |
( ) | 선언된 엘리먼트들을 하나의 그룹으로 선언 |
* | 선언된 엘리먼트가 0번 이상 사용될 수 있음 (0~n) |
+ | 선언된 엘리먼트가 1번 이상 사용될 수 있음 (1~n) |
? | 선언된 엘리먼트가 0번 또는 1번 사용될 수 있음 (0~1) |
무기호 | 특별한 기호가 없으면 선언된 엘리먼트를 반드시 한 번만 사용 |
엘리먼트들의 content로 문자 데이터와 자식 엘리먼트를 동시에 선언할 때 사용
형식
<!ELEMENT 엘리먼트명 (#PCDATA | child1 | child2 | ... )*>
★ 주의사항 ★
• 문자 데이터(#PCDATA
)를 먼저 선언
• 혼합 내용의 반복성은 0번 이상(*
)으로 정의
Content를 갖지 않는 빈 엘리먼트를 정의하기 위해 사용
빈 엘리먼트의 경우 content가 없으므로 일반적으로 속성을 가짐
형식
<!ELEMENT 엘리먼트명 EMPTY>
엘리먼트 사용 방법
시작 태그와 종료 태그 사이에 공백이 있으면 안 됨
<엘리먼트명></엘리먼트명>
<엘리먼트명 />
엘리먼트의 content에 대해 조건을 두지 않을 경우에 사용
정의되는 엘리먼트는 임의의 구조를 가질 수 있음
➡ DTD 내에 선언된 모든 엘리먼트들을 자식 엘리먼트로 가질 수 있음
ANY content 유형은 XML 문서 처리를 위한 응용 프로그램 개발을 어렵게 하기 때문에 잘 사용되지 않는다.
형식
<!ELEMENT 엘리먼트명 ANY>
속성은 엘리먼트에 부가적인 정보를 제공한다.
엘리먼트와 관련된 속성 이름, 속성 유형, 속성 기본값 등을 정의
형식
<!ATTLIST 엘리먼트명
속성명1 속성유형 속성기본값
속성명2 속성유형 속성기본값
...
>
엘리먼트 작성 시 속성을 생략할 수 있는지, 반드시 기술해야 되는지 등을 지정
속성이 생략될 때 속성이 갖는 디폴트 값 지정 가능
값 | 의미 |
---|---|
#REQUIRED | 속성을 반드시 기술해야 함 |
#IMPLIED | 속성을 생략 가능 |
#FIXED value | 속성의 값을 미리 지정 (변경 불가) |
value | 속성이 생략될 때 사용될 default 값 지정 |
• 문자열 타입(CDATA): 임의의 문자열을 속성 값으로 가짐
• 열거형 타입: 열거된 여러 값들 중 하나를 속성 값으로 가짐
• 토큰 타입: 다음과 같은 키워드를 사용하여 속성 값 유형을 정의
속성 유형 | 설명 |
---|---|
ID | 속성값은 엘리먼트들을 구별하기 위한 식별자로 사용되며, XML 문서 내에서 유일한 값을 가져야 함 |
IDREF IDREFS | 속성값은 XML 문서 내에서 ID 속성으로 사용된 값만 사용할 수 있음 다른 엘리먼트의 ID 속성값을 참조하기 위해 사용됨 |
NMTOKEN NMTOKENS | 속성값은 XML 이름 작성 규칙을 준수하는 문자 데이터만 사용할 수 있음 |
NOTATION | 속성값은 DTD에 명시적으로 선언된 notation명만 사용할 수 있음 |
ENTITY ENTITIES | 속성값은 DTD에 명시적으로 선언된 entity명만 사용 가능함 |
속성 값에 대해 특수 문자를 제외하고 어떤 문자열도 사용 가능
특수 문자를 사용할 때는 개체 참조 이용
DTD에 열거된 값들 중에서 하나를 사용하도록 함
✔︎ 괄호 안에 나열된 값 이외의 값은 사용 불가
XML 문서에서 엘리먼트들을 유일하게 식별해야 할 경우 사용
★ 주의 사항 ★
• 속성 기본 값은 #IMPLIED
또는 #REQUIRED
만 사용 가능
• 각 엘리먼트에서 ID 타입 속성은 하나만 정의 가능
• 문서 내에서 ID 타입 속성의 값은 중복이 될 수 없음
• ID 타입 속성의 값은 반드시 XML 이름 작성 규칙을 따라야 함
ID 타입으로 선언된 속성이 갖는 값들 중 하나를 가짐
✔︎ IDREF(S)
타입 속성의 값은 문서 내에 포함된 ID 속성 값들 중에 일치(참조)하는 것이 반드시 있어야 함
IDREFS
: ID 타입으로 선언된 속성 값들 중 여러 개를 동시에 참조 가능
✔︎ 속성 값들은 공백 문자로 구분
XML 문서를 구성하는 물리적인 저장 단위
종류
• 문서 entity: 일반적인 XML 문서
• 외부 DTD subset entity: DTD 문서
• 빌트인(built-in) entity
• 내부 일반 parsed entity
• 외부 일반 parsed entity
• 외부 일반 unparsed entity
• 내부 파라미터 entity
• 외부 파라미터 entity
XML 문서에서 구성 요소의 공유 및 재사용
물리적 저장 단위에 따른 구분
• 내부(internel) : 같은 DTD 내에 정의
• 외부(external) : 별도의 파일로 정의
참조되는 위치에 따른 구분
• 일반(general) : XML 문서에서 참조하여 사용
• 파라미터(parameter) : DTD 문서에서 참조하여 사용
XML parser가 해석 가능한지 여부에 따른 구분
✔︎ 일반 개체만 해당됨
• Parsed : XML parser가 해석할 수 있는 내용으로 구성
• Unparsed : XML parser가 해석할 수 없는 비문자 데이터로 구성
미리 정의되어 있는 개체
참조 방법 | 치환될 문자 | 의미 |
---|---|---|
< | < | less-than |
> | > | greater-than |
& | & | ampersand |
" | " | double-quote |
' | ' | single-quote |
DTD 내에서 문자 데이터로 선언되고, 별도의 물리적인 파일 형태를 갖지 않는다.
형식 (DTD)
<!ENTITY entity명 "대체할 문자 데이터">
참조 형식 (XML)
&entity명;
XML 문서에서 자주 사용되는 엘리먼트들을 별도의 물리적인 파일로 저장한 것
형식 (DTD)
<!ENTITY entity명 SYSTEM "entity file의 경로">
참조 형식 (XML)
&entity명;
비-문자 데이터로 이루어진 물리적인 저장 단위를 참조
ex 음악 파일, 그림 파일, 동영상 파일
선언 (DTD 문서)
Notation과 외부 일반 unparsed entity 선언
엘리먼트에 대해 ENTITY 타입의 속성 선언
참조 (XML 문서)
ENTITY 타입 속성으로 외부 일반 unparsed entity의 이름을 지정
DTD 내용의 일부를 DTD 문서 내에서 참조하기 위해 선언
DTD 내에서 선언되고 참조되기 때문에 선언되는 위치는 반드시 참조되기 전에 와야 한다.
형식 (DTD)
<!ENTITY % entity명 "대치할 DTD 내용의 일부분">
참조 형식 (DTD)
%entity명;
DTD 내용의 일부를 DTD 문서와 다른 물리적인 저장 단위로 저장한 것
여러 DTD 문서들에서 공통적으로 사용되는 부분을 별도의 파일로 저장하고, 외부 파라미터 entity를 선언한 후 각 DTD 문서에서 참조해서 이용한다.
형식 (DTD)
<!ENTITY % entity명 SYSTEM "entity 파일의 경로"
참조 형식 (DTD)
%entity명;
그림, 동영상, 음악 등 binary 파일의 포맷을 식별
➡ MIME type 이용 (ex text/html
, image/jpeg
)
XML parser가 해석할 수 없는 비-문자 데이터의 포맷과, 데이터를 처리할 응용 프로그램을 지정
형식
<!NOTATION notation명 SYSTEM "SYSTEM 식별자">
<!NOTATION notatoin명 PUBLIC "PUBLIC 식별자" "SYSTEM 식별자">
• SYSTEM 식별자
: 응용 프로그램
• PUBLIC 식별자
: MIME type
𝟏. NOTATION 타입의 속성 값으로 사용
NOTATION 타입의 속성 값으로 사용
형식
<!ATTLIST 엘리먼트명 속성명
NOTATION (notation명1|notation명|...) "기본값 선언">
★ 주의 사항 ★
• EMPTY 엘리먼트는 NOTATION 타입의 속성을 가질 수 없음
• 각 엘리먼트는 NOTATION 타입의 속성을 최대 하나만 가질 수 있음
𝟐. 외부 일반 unparsed entity의 포맷을 지정하기 위해 사용
외부 일반 unparsed entity를 정의하기 위해서는 그 entity가 어떤 포맷으로 저장되어 있는지를 선언해야 함
형식
<!ENTITY entity명 SYSTEM "entity 파일의 경로" NDATA notation명>
DTD 문서 내부에서 어떤 조건에 따라 DTD의 내용을 포함하거나 포함하지 않도록 하기 위해 사용
형식
<![INCLUDE[
적용시킬 DTD 내용
]]>
<![IGNORE[
무시할 DTD 내용
]]>
• INCLUDE
키워드로 정의한 부분은 유효성 검사 대상
• IGNORE
키워드로 정의한 부분은 XML parser가 읽기는 하지만 유효성 검사에서는 제외됨