회사 내부 스터디에 사용한 것.
Professional XML 2nd ed.를 정리한 것임.
DTD ?
Document Type Definition - 문서 형 정의
DTD 선언은 데이터 안에 포함하거나 별도의 다른 문서로 존재할 수 있다. DTD는 XML 데이터의 구조와
내용을 나타내는 규칙을 정의한다. 단 하나의 DTD만이 XML 문서와 데이터 객체에 연관될 수 있다.
내부/외부 서브셋
내부 서브셋 : DTD 선언을 XML 데이터 내부에 포함.
외부 서브셋 : DTD 선언이 다른 문에서 위치. .dtd 파일
내부 서브셋에 있는 DTD 선언은 외부 서브셋에 있는 선언보다 우선순위가 높다. 유사한 선언이
양쪽에 존재할 때, 내부 서브셋의 선언이 사용된다.
XML과 DTD 연결
DOCTYPE 선언을 이용한다.
XML문서내에 DOCTYPE선언은 단 한번만 나올 수 있다.
XML 선언 바로 다음에 나와야 한다.
SYSTEM
<!DOCTYPE doc_element SYSTEM location [내부 서브셋] >
doc_element란 문서의 root 요소를 의미한다.
내부 서브셋은 선택적이다.
SYSTEM 키워드는 DTD의 위치를 명시적으로 가리키는데 사용한다. URL형식을 사용한다.
예
<!DOCTYPE Toysco SYSTEM "http://www.wrox.com/DTDs/Toysco.dtd">
<!DOCTYPE Toysco SYSTEM "file:///DTDs/Toysco.dtd">
반드시 파일이나 지정된 URL에 접근 가능한 권한이 있어야만 한다.
PUBLIC
<!DOCTYPE doc_element PUBLIC identifier location [내부 서브셋] >
PUBLIC 키워드는 내부 시스템과 SGML 애플리케이션에서 사용하도록 제한되어 있다.
예
<!DOCTYPE Toysco PUBLIC "BigBusinessConsortium/DTDs/Toysco">
PUBLIC 위치에서 DTD를 검색하는 것은 DTD를 애플리케이션(파서)이 알아서 찾아서 처리하라는 뜻이다.
보통 PUBLIC 식별자와 함께 SYSTEM 스타일의 위치 지정. PUBLIC 위치를 사용할 수 없을 경우 대체 위치 제공.
<!DOCTYPE Toysco PUBLIC "BigBusinessConsortium/Toysco"
"http://www.wrox.com/DTDs/Toysco.dtd">
PUBLIC 위치에서 DTD를 찾지 못하면 SYSTEM 위치에서 찾는다. SYSTEM 키워드는 내부적으로 암시되어 있다.
내부 서브셋
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE Toysco PUBLIC "BigBusinessConsortium/Toysco"
"http://www.wrox.com/DTDs/Toysco.dtd"
[
DTD 선언 #1
DTD 선언 #2
...
]>
<!-- 외부 서브셋은 PUBLIC 키워드로 참조된다. -->
<!-- 내부 서브셋은 위의 "[]" 사이에 포함된다. -->
<Toysco>
...
</Toysco>
DTD 선언
DTD 선언은 <!keyword param1 param2 ... paramN> 형태로 한다.
공백문자는 여러개를 사용해도 된다.
단, <!keyword 에서 !와 keyword 사이에는 공백이 없다.
DTD 키워드
키워드
설명
ELEMENT
XML 요소 형이름과 허가된 하위 요소들(자식)을 기술한다.
ATTLIST
XML 요소 속성 이름과 허가된 또는 기본 속성 값을 기술한다.
ENTITY
특별한 문자 참조. 텍스트 매크로, 외부 소스의 반복되는 내용을 기술한다.
NOTATION
외부의 비 XML 내용(예를 들어, 바이너리 이미지 데이터)과 그 내용을 처리하는 외부 애플리케이션 기술.
* ELEMENT, ATTLIST, ENTITY가 핵심이다.
요소 형(ELEMENT) 선언
아래 두 가지 형태의 선언이 있다.
<!ELEMENT name content_category>
<!ELEMENT name (content_model)>
name : 요소의 이름.
content_category와 content_model은 이 요소가 포함할 수 있는 내용의 종류를 의미한다.
Content Category
어떤 데이타가 올 수 있는가?
Any
<!ELEMENT AnythingGoesHere ANY>
Well-Formed 인 XML 아무거나 올 수 있다. 유효성 검사를 무력화 시키므로 사용하지 말 것.
Empty
<!ELEMENT img EMPTY>
속성 이외에는 아무것도 올 수 없다. HTML의 img 태그 등이 그 예이다.
예
<img src=http://img.yahoo.co.kr/blank.gif>
<br></br> <!-- 태그 사이에 아무 값도 없다 -->
Content Model
<!ELEMENT name (content_model)cardinality>
요소 선언에서 내용 모델(Content Model)은 요소 형의 구조와 내용을 기술하기 위해 사용한다.
쉽게 말하면, 요소안에 어떤 다른 요소가 어떤 순서로 몇 개 올수 있는가. 아니면 텍스트만 올 수 있는가 등을 지정한다.
내용 모델은 세가지로 나눌 수 있다.
Text Only : 문자 데이타만 올 수 있다. 자식 요소는 올 수 없다.
Element Only : 자식 요소만 올 수 있다. 자식 외부에 텍스트를 둘 수 없다.
Mixed : 자식 요소와 텍스트 혼합.
ANY나 EMPTY 카테고리에서 내용 모델이 필요없다.
cardinality 란 내용 모델이 몇개 반복 될 수 있는지 결정하는 것이다.
순차와 선택 리스트
순차 리스트 : 자식 요소들이 지정된 순서대로 나와야 한다. 자식 요소들의 이름을 구분하기 위해 쉼표(,)를 사용.
<!ELEMENT name (child1, child2) >
선택 리스트 : 지정된 자식 요소들 중에서 단 한개만 나타날 수 있다.
<!ELEMENT name (#PCDATA | child1 | child2) >
Text-Only(PCDATA)
#PCDATA로 지정한다.
<!ELEMENT foo (#PCDATA) >
문자열만 올 수 있다.
PCDATA 카테고리를 가진 요소는 실제 데이터와 엔티티 참조만을 허용한다.
<foo>
어쩌구 저쩌구 메롱~~
</foo>
Eelement-Only
자식 요소만을 포함한다. 지정된 자식 요소만을 포함할 수 있다. 자식 요소의 외부에 텍스트를 포함할 수 없다.
<foo>
<a_child_element>haha</a_child_element>
<!-- 이런 부분에 일반 텍스트는 올 수 없다!! 주석은 어디에나 올 수 있다.-->
<another_child>some message</another_child>
<a_third_child>hi~</a_third_cihld>
<!-- 여기에도 일반 텍스트는 올 수 없다!! -->
</foo>