달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2007. 2. 15. 19:13

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>&quot;To levitate a human being would take a magnet....&quot;</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 "&#9837;">
  ]>

  <description>>
    This rehearsal will showcase... improvisation in B&flat;,....
  </description>

3. 외부 entity
  파일과 같은 외부 자원들을 참조하는 entity

  parsed entity
    일반 entity의 생성 방법과 비슷하나 특정 문자를 참조하는 대신 SYSTEM이나 PUBLIC 식별자를 이용한다.

 <!DOCTYPE orchestra SYSTEM "orchestra.dtd" [
   <!ENTITY flat "&#9837;">
   <!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 &#34;&#x266F;&#24;>">
    %flatEnt;

    <!ENTITY sharp "&#x266F;">
    <!ENTITY natural "&#x266E;">
    ...
  ]>

  <!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
:
Posted by 뽀기