07.DTD(Document Type Definition) 그거/Tech2007. 2. 15. 19:13
# DTD의 유형
DTD는 XML 문서의 문서 구조를 정의하고, 해당 문서들이 정의된 문서 구조를 지키도록 하는데 이용된다.
1. 외부 DTD
외부 문서에 XML 문서의 모든 정의를 가지고 있는 형식
- 간단한 DTD 정의의 예
<!ELEMENT orchestra (instruments)>
<!ELEMENT instruments (woodwind)>
<!ELEMENT woodwind (#PCDATA)>
- 외부 DTD 사용의 예
<!DOCTYPE orchestra SYSTEM "orchestra.dtd">
- DOCTYPE 선언부
<!DOCTYPE : 현재부터 > 기호 이전까지 문서 형식의 선언을 위한 영역임을 표시
orchestra : 이 XML 문서에서의 root element 이름. XML 문서내의 다른 element로 변경 가능
- SYSTEM 식별자
해당 DTD 문서가 시스템의 어디에 위치하는지 알리기 위해서 사용
- PUBLIC 식별자
DTD 파일의 위치를 표시하는 것이 아니라 공식정인 이름을 지정하는데 사용
XHTML 문서에 대한 DTD PUBLIC 식별자의 이름
-//W3C//DTD XHTML 1.0 Transitional//EN
문서가 변경되거나 이동될 때, 문서 작성자가 DTD에 대한 위치 경로를 신경쓰지 않도록 함으로써 더 쉽게 관리할 수 있도록 함
PUBLIC 식별자를 인식하지 못하는 XML 프로세서를 위해 PUBLIC, SYSTEM 둘 다 표시하는 것이 일반적
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitinal//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-trasitional.dtd">
{표준지시자}//{조직 이름}//{DTD 이름}//{언어}
표준지시자 : 이 문서가 표준 기구에서 승인되었는지 여부(표준이면 +, 아니면 -)
조직 이름 : 이 DTD의 생성과 유지에 대한 책임이 있는 조직의 이름
DTD 이름 : DTD의 이름
언어 : 이 문서가 어떤 문서로 작성되었는지 ISO 639 언어 코드값으로 표기
2. 내부 DTD
DTD 정보는 [] 안에 위치한다.
내부 DTD는 standalone 문서를 작성하기 위해 사용하며, 이는 XML 선언부에서 standalone="yes"로 선언한다.
XML 선언부에 standalone에 대한 언급이 없으면 기본으로 standalone="no" 이다.
# element와 contents model의 생성
element 선언문의 구조
<!ELEMENT {이름} ({content smodel})>
1. 컨텐츠 변경자
element의 출현 빈도 명시
? : 선택적인 element. 나타나지 않을 수도 있으며, 나타나면 한 번만 나타남
+ : 반드시 나타나야 하는 element. 한 번 이상
* : 반복하여 나타나는 element. 0 번 이상
<!ELEMENT orchestra (performance, instruments)>
<!ELEMENT performance (piece+)> : 하나 이상의 piece element를 갖는다.
<!ELEMENT piece (#PCDATA)>
<!ELEMENT instruments (violin*, glockenspiel?)> : violin은 한 번도 안나타나거나 여러번 나타나고, glockenspiel은 없거나 한 번만 나타남
<!ELEMENT violin (#PCDATA)>
<!ELEMENT glockenspiel (#PCDATA)>
2. element 선택자
| : A or B
<!ELEMENT orchestra (performance, instruments)>
<!ELEMENT performance (piece+ | improv)> : 한 개의 improv element나 한 개 이상의 piece element 중 하나만 선택
<!ELEMENT piece (#PCDATA)>
<!ELEMENT improv (#PCDATA)>
<!ELEMENT instruments (violin*, glockenspiel?) | (piano?, clarinet+)> : instrumenets element는 violin, glockenspiel element를 갖거나 piano, clarinet element의 조합을 갖게 된다.
<!ELEMENT violin (#PCDATA)>
<!ELEMENT glockenspiel (#PCDATA)>
<!ELEMENT piano (#PCDATA)>
<!ELEMENT clarinet (#PCDATA)>
DTD가 가지는 한계
XML 문서의 작성자가 컨텐츠 모델 변경자와 OR 연산자를 통해 임의의 순서로 element가 나타나게 할 수 있으나 element의 출현 횟수를 제어할 수 없다.
3. 혼합 컨텐츠
element가 자식 element와 text contets를 모두 갖는 경우
<description>
this rehearsal will showcase <violin>Joel Borgnine</violin>L and his brilliant improvisation, <improv>Jazz on the Shore</improt>.
</description>
<!ELEMENT description ( #PCDATA | violin | improv | piece )*>
4. ANY element
한 element가 DTD 내에 정의되어 있는 다른 어떠한 element들도 포함할 수 있는 기능을 제공
<!ELEMENT description ANY>
description element는 DTD 내에 정의되어 있는 다른 어떠한 element도 포함할 수 있다.
5. EMPTY element
element의 contents model이 아무런 정보를 갖지고 있지 않은 경우
예)<img src="../test.gif"/>
<!ELEMENT intermission EMPTY>
<intermission/> == <intermission></intermission>
<intermission/> != <intermission> </intermission>
intermission의 contents model에 공백 문자가 삽입되므로 같지 않다.
# attribute의 정의
attribute list의 형식
<!ATTLIST {element 이름} {attribute 이름} {타입} {기본값} {옵션}>
1. attribute의 기본값
intermission element의 생략 가능한 setup attribute, length attribute
<!ATTLIST intermission setup CDATA #IMPLIED
length CDATA #IMPLIED>
intermission element에서 꼭 있어야 하는 setup attribute, 생략가능한 length attribute
<!ATTLIST intermission setup CDATA "full" #REQUIRED
length CDATA #IMPLIED>
intermission element에서 생략가능한 setup attribute, 생략가능하지만 기본값은 "15 minutes"로 고정되서 바꿀 수 없는 length attribute
<!ATTLIST intermission setup CDATA "full"
length CDATA #FIXED "15 minutes">
2. 나열형 attribute
DTD에서는 attribute에 대한 고정값을 명시할 수 있을 뿐만 아니라 이용 가능한 값의 집합을 나열할 수 있다.
setup attribute에 대해서 기본값은 full, partial, minimal 중에 하나를 가질 수 있으며, 지정하지 않을 경우는 full을 값으로 설정
<!ATTLIST intermission setup (full | partial | minimal) "full"
length CDATA #FIXED "15 minutes">
<!ATTLIST intermission setup (full | partial | minimal) "full"
length CDATA #FIXED "15 minutes">
<!ATTLIST piano type (accoustic | electronic) #IMPLIED>
<!ATTLIST violin seat (first | second | other) #REQUIRED>
3. ID, IDREF 타입
XML DTD에서는 DB의 기본키/외래키 기능을 지원하기 위해 ID, IDREF attribute를 정의해 놓고 있다.
piece element에 대해서 IDREF 타입으로 pid attribute를 꼭 사용하도록 정의
<!ATTLIST piece pid IDREF #REQUIRED>
improv element에 대해서 IDREF 타입으로 iid attribute를 꼭 사용하도록 정의
<!ATTLIST improv iid IDREF #REQUIRED>
concertpiece element에 대해서 ID 타입으로 pieceid attribute를 꼭 사용하도록 정의
<!ATTLIST concertpiece pieceid ID #REQUIRED>
제약조건
ID attribute의 값은 숫자로 시작할 수 없다.
구두점이나 공백문자를 포함할 수 없으며,
이 값은 문서 내에서 유일해야 한다.
IDREF attribute의 값은 문서 내에서 유일하지 않아도 무방하다.
문서 내에 존재하는 ID attribute의 값과 일치해야 한다.
IDREF 의 값은 ID의 값과 같아야 한다.
<piece pid="_1"/>
<piece pid="_2"/> <-- "_2"라는 ID 값이 없기 때문에 오류 발생
<concertpieces>
<concertpiece pieceid="_1">test</concertpiece>
</concertpieces>
IDREFS 타입 : attribute list의 선언에서 사용될 수 있으며, 공백문자로 구분되는 여러 개의 IDREF 값을 취급한다.
<!ATTLIST piece pid IDREFS #REQUIRED>
<performance>
<piece pid="_1 _3"/>
</performance>
IDREFS 의 각 값은 문서 내에 존재하는 ID의 값이어야 한다.
4. NMTOKEN 타입
ID 타입처럼 공백문자를 포함할 수 없으나 ID와는 달리 숫자로 시작할 수 있다.
<!ATTLIST concertpiece pieceid ID #REQUIRED
genre NMTOKENS #IMPLIED>
<concertpiece pieceid="_1" genre="jazz modern">Jazz on the Shore</concertpiece>
IDREF 타입과는 달리 문서 내의 다른 구성 요소나 attribute 들을 참조하지 않는다.
# 일반 entity
entity : XML 문서에서 다른 contents에 대한 참조를 나타내며,
이를 문서 내에서 이용하기 위해서는 entity 이름의 앞과 뒤에 &와 ;를 붙여 호출한다.
<p>"To levitate a human being would take a magnet...."</p>
1. custom entity
문서 내에서 빈번하게 출현하는 data를 간략화ㅗ 할 수 있다.
<!DOCTYPE orchestra SYSTEM "orchestra.dtd" [
<!ENTITY callwarning "Please arrive prepared to play!">
]>
<description>
&callwarning;
This rehearsal will showcase ....
</description>
parsed entity
일반적인 text 정보
2. 이름 entity와 산술형 entity
산술형 entity
<!DOCTYPE orchestra SYSTEM "orchestra.dtd" [
<!ENTITY flat "♭">
]>
<description>>
This rehearsal will showcase... improvisation in B♭,....
</description>
3. 외부 entity
파일과 같은 외부 자원들을 참조하는 entity
parsed entity
일반 entity의 생성 방법과 비슷하나 특정 문자를 참조하는 대신 SYSTEM이나 PUBLIC 식별자를 이용한다.
<!DOCTYPE orchestra SYSTEM "orchestra.dtd" [
<!ENTITY flat "♭">
<!ENTITY concertpieces SYSTEM "musicalnumbers.xml">
]>
</orchestra>
<instruments>
<violin seat="first">...</violin>
</instruments>
&concertpieces;
</orchestra>
일반 entity는 문서 내에서 정의되기 때문에 XML 문서의 파싱 과정에서 이 entity들이 text 정보로 대체되면서 XML 문서의 잘 구성됨 조건을 위배할 수 있다.
XML 문서가 유효성 검사를 수행하지 않는 XML parser를 이용한다면, 이 parser는 외부 문서에 대한 유효성 검사를 수행하지 않음으로써 문제를 발생시킬 수 있다.
unparsed entity
image 파일과 같은 바이너리 데이터를 XML 문서에서 참조할 경우, 이 파일의 내용 정보를 XML 문법으로 파싱하지 못하도록 하기 위해 이용
notation을 이용하여 해당 파일의 타입을 정의하고 외부 entity 선언으로 이 notation에 대한 참조를 설정한다.
<!DOCTYPE orchestra SYSTEM "orchestra.dtd" [
...
<!ENTITY concertpieces SYSTEM "musicalnumbers.xml">
<!NOTATION gif SYSTEM "c:\winnt\system32\mspaint.exe">
<!ENTITY logo SYSTEM "logo.gif" NDATA gif>
<!ENTITY violinimg SYSTEM "violing.gif" NDATA gif>
<!ENTITY firstseatimg SYSTEM "firstseat.gif" NDATA gif>
<!ENTITY glockenspielimg SYSSTEM "glockenspiel.gif" NDATA gif>
<!ATTLIST violin graphics ENTITIES #IMPLIED>
<!ATTLIST glockenspiel graphics ENTITY #IMPLIED>
]>
...
<violin seat="first" graphics="violinimg firstseatimg">Joel Borgnine</violin>
<glockenspiel graphics="glockenspielimg">Marie Andrassy</glockenspiel>
...
entity를 이용할 경우 entity의 호출은 &와 ;를 앞뒤에 붙이지 않는다.
# 파라미터 엔티티
DTD에서 사용되는 entity. % 기호화 하나의 공백이 정의할 때 함께 추가된다.
일반 attribute나 element group 처럼 미리 정의된 DTD 정의의 일부를 다시 DTD에서 여러 번 이용해야 할 경우
<!DOCTYPE orchestra SYSTEM "orchestra.dtd" [
<!ENTITY % flatEnt "<!ENTITY flat "♯>">
%flatEnt;
<!ENTITY sharp "♯">
<!ENTITY natural "♮">
...
]>
<!ENTITY % seatAtt "first | second | other">
<!ATTLIST violin seat (%seatAtt;) #REQUIRED>
<!ELEMENT concertpieces (concertpiece*)>
1. DTD 정의의 취사 선택
DTD에서의 조건 절
<![INCLUDE[
<!ELEMENT instruments (piano?, clarinet+)>
]]>
<![IGNORE[
<!ELEMENT instruments (violin*, glockenspiel?)>
]]>
조건절과 parameter entity를 사용하여 아래와 같이 변경 가능하다
<!ENTITY % woodwind "INCLUDE">
<!ENTITY % string "IGNORE">
<!ELEMENT orchestra (performance, description, instruments, concertpieces)>
...
<!ELEMENT description ANY>
<![%woodwind;[
<!ELEMENT instruments (piano?, clarinet+)>
]]>
<![%string;[
<!ELEMENT instruments (violin*, glockenspiel?)>
]]>
parameterized DTD
<!ENTITY % woodwind "INCLUDE">
<!ENTITY % string "IGNORE">
<!ENTITY % custom "IGNORE">
<!ENTITY % customSet "">
...
<![%woodwid;[
<!ELEMENT instruments (piano?, clarinet+)> // INCLUDE
]]>
<![%string;[
<!ELEMENT instruments (viloin*, glockenspiel?)> // IGNORE
]]>
<![%custom;[
<!ELEMENT instruments (%customSet;)> // IGNORE
]]>
parameter entity의 이용
<!ENTITY % woodwind "IGNORE">
<!ENTITY % string "IGNORE">
<!ENTITY % custom "INCLUDE"> // INCLUDE 됐기 때문에 위에서 <!ELEMENT instruments (%customSet;)>을 사용함
<!ENTITY % customSet "piano, glockenspiel">
...
<instruments> // <!ELEMENT instruments (%customSet;)>을 사용하는데 %customSet; 이 piano, glockenpiel 이기 때문에
<piano>xxx</piano> // instruments element는 piano, glockenpiel element를 포함한다
<glockenspiel graphics="glockenspielimg">xxxa</glockenspiel>
</instruments>
...
'그거 > Tech' 카테고리의 다른 글
09. XSLT(eXtensible Stylesheet Language Transformations) (0) | 2007.02.20 |
---|---|
08.XML Schema (0) | 2007.02.16 |
06. XML 문서에 대한 유효성 검증 (0) | 2007.02.15 |
05. XML 스트림 (SAX) (0) | 2007.02.14 |
04. DOM의 활용(고급편) (0) | 2007.02.14 |