상세 컨텐츠

본문 제목

DTD문서 작성법 2 (속성작성, 노테이션)

Web Development/Others

by thankee 2008. 9. 12. 03:12

본문

엘리먼트에 속성 만들기

엘리먼트에 속성을 만들기 위한 문법으로는 아래와 같으며, 아래의 ATTLIST엘리먼트를 구성하는 요소 중에서 엘리먼트명, 속성명, 속성타입, 디폴트 정의 등 하나라도 생략될 수 없다.

-DTD파일 예제
<?xml version="1.0"?>

<!-- 엘리먼트 정의 -->
<!ELEMENT 엘리먼트명 유형>

<!-- 엘리먼트에 대한 속성 정의 -->
<!ATTLIST 대상엘리먼트명
        속성명 속성타입 디폴트정의
        속성명2 속성타입2 디폴트정의2
        ...
        속성명n 속성타입n 디폴트정의n>

속성명 작성

속성명은 해당 엘리먼트에 부여되는 속성의 이름이 되며, 작명규칙은 아래와 같다.

  • 숫자나 '_'를 제외한 특수문자로 시작할 수 없다.
  • 공백이 이름에 포함될 수 없으며, 둘째 문자 부터 숫자와 '_', '-', '.', ':' 등의 특수문자 사용이 가능하다.

속성타입 작성

속성타입(Attribute Type)이란 속성이 가질 수 있는 데이터의 형태를 뜻하며, 그 종류는 아래와 같다.

  • CDATA : 단순한 문자데이터를 받을 경우 사용하는 유형이다.
        <!ATTLIST 엘리먼트명 속성명 CDATA 디폴트정의>
  • ID : 엘리먼트를 유일하게 구별할 수 있는 식별자를 지정하기 위해서 사용된다. ID를 속성타입으로 사용하게 되면 그 속성의 값은 그 XML문서의 ID값들 중에서 유일한 값만이 올 수 있다. 이 ID라는 속성의 DB에서 기본값과 같은 역할을 한다고 볼 수 있다. 이 ID 속성타입의 사용에는 약간의 제약사항이 존재한다.
    - ID속성은 하나의 엘리먼트에 하나만 존재할 수 있다.
    - ID속성의 값으로 공백이 포함될 수 없다.
    - ID속성의 값은 숫자로 시작할 수 없다.
        <!ATTLIST 엘리먼트명 속성명 ID 디폴트정의>
  • IDREF 또는 IDREFS : 해당 xml파일에서 ID 속성의 값만을 속성 값으로 받을 수 있는 속성타입이다. DB에서 외래키와 같다고 볼 수 있다. 
    - 이 속성타입은 이미 정의된 다른 ID값을 받기 때문에, ID와 제약사항이 같을 수 밖에없다.(즉 ID속성유형과 같이 속성값으로 공백이 포함될 수 없고, 숫자로 시작할 수 없다)0
    -  IDREF와 IDREFS의 차이점은 IDREF는 하나의 값만이 지정될 수 있지만, IDREFS는 여러 값들이 지정될 수 있다. 즉, IDREFS는 여러 ID값을 받을 수 있는데, 구분은 공백으로 한다.
        <!ELEMENT person EMPTY>
        <!ATTLIST person
            name ID #REQUIRED
            bestfriend IDREF #IMPLIED
            friends IDREFS #IMPLIED>
    위와 같이 DTD문서에 정의되어 있을 경우, person 엘리먼트의 속성은 다음과 같이 될 수 있다.
        <!-- IDREF와 IDREF값으로는 ID로 지정된 값만을 취할 수 있다. -->
        <person name="송준수" bestfriend="송준수">
        <person name="김수미" />
        <person name="고아라" bestfriend="송은영" />
        <person name="백승환" friends="고아라" />
        <!-- IDREFS는 여러 ID값이 지정될 수 있다.-->
        <person name="송은영" bestfriend="고아라" friends="백승환 고아라 김수미 송준수 송은영" />
  • NMTOKEN 또는 NMTOKENS : 작명규칙을 따르는 문자데이터형을 속성값으로 받을 수 있도록 한다. 작명규칙은 속성작명규칙과 같다. NMTOKENS는 공백으로 구분된 여러 값들을 받을 수 있도록 해준다.
  • 열거형(ENUMERATION) : 지정한 여러 속성값 중 하나를 선택할 수 있도록 하는 것이다.
        <!ATTLIST 속성명 (속성값1 | 속성값2 | 속성값n) 디폴트정의>
        <!ATTLIST occupation (student | professor | officer) #IMPLIED>
  • ENTITY 또는 ENTITIES : ENTITY값을 속성값으로 받을 수 있다. 하지만, 모든 엔티티값을 받을 수 있는 것은 아니다. 외부 일반 언파스드 엔티티, 즉 외부 파일로서 해석되지 않는 자료를 엔티티로 선언 했을 경우, 이 ENTITY로 지정한 속성의 값으로 받을 수 있다. ENTITIES는 ENTITY와 같지만 여러 값을 받을 수 있으며, 각 값들은 공백으로 구분된다.
        -DTD문서
        <?xml version="1.0"?>
        <!-- ENTITY에서 지정될 이미지에 대한 노테이션을 선언한다. -->
        <!NOTATION gif SYSTEM "painter.exe">
        <!-- 속성으로 사용될 외부 일반 언파스드 엔티티 선언 -->
        <!ENTITY SonPic SYSTEM "son.gif" NDATA gif>
        <!ENTITY KimPic SYSTEM "kim.gif" NDATA gif>
        <!--엘리먼트 선언-->
        <!ELEMENT people (person)*>
        <!ELEMENT person EMPTY>
        <!-- 속성 선언, ENTITY의 속성 타입을 사용했다.-->
        <!ATTLIST person
                name CDATA #REQURIED
                img ENTITY #REQUIRED>
        -XML문서
        <?xml version="1.0"?>
        <people>
            <!-- ENTITY타입의 속성인 img에 ENTITY값을 할당 -->
            <person name="손담비" img="SonPic" />
            <person name="김수로" img="KimPic" />
        </people>
  • NOTATION : Notation을 속성 값으로 받도록 할 수 있다.
    <!ATTLIST 대상엘리먼트명 속성명 NOTATION (노테이션명1 | 노테이션명2 | 노테이션명n) 디폴트정의>
    <!ELEMENT person EMPTY>
    <!ATTLIST person
           img CDATA #IMPLIED
          type NOTATION (gif | jpg) #IMPLIED>
    <!-- 위 DTD에 대한 xml파일 내용-->
    <person img="mypic.gif" type="gif" />

디폴트정의

속성의 Default값을 지정해주거나, 속성값을 생략하거나 반드시 기술하도록 정의하는 부분이다. 여기서 사용할 수 있는 값들은 다음과 같다.

  • Default 값 지정 : 속성 값 생략 시 기본적으로 지정될 데이터를 지정하면 됩니다. #IMPLIED, #FIXED와 같이 속성값을 생략할 수 있는 형태이다.
    <!ATTLIST 대상엘리먼트명 속성명 속성타입 "기본적으로 지정될 속성 값">
    <!ATTLIST person name EMPTY "Unknown">

    <!-- 생략 시 name속성의 값은 'Unknown'이 된다. -->
    <person></person>
  • #IMPLIED : 말 그대로, 속성을 생략할 수 있게 된다. <!ATTLIST 대상엘리먼트명 속성명 속성타입 #IMPLIED>
    <!ATTLIST person name EMPTY #IMPLIED>

    <!-- 생략 시 name 속성 값은 공란이 된다. -->
    <person></person>
  • #FIXED : 해당 속성값으로 고정값을 주고 싶을 때 사용합니다. 지정된 값 이외의 어떠한 값도 지정이 불가능하며, 그렇기 때문에 XML문서에서 속성값 작성을 생략할 수 도 있다.
    <!ATTLIST 대상엘리먼트명 속성명 속성타입 #FIXED "고정값지정">
    <!ATTLIST person occupation EMPTY #FIXED "Professor">

    <!-- 고정값 이외의 데이터는 기술 할 수 없다. -->
    <person occupation="Professor" />
    <!-- 생략 시 name 속성 값은 'Professor'가 된다. -->
    <person></person>
  • #REQUIRED : 속성값이 반드시 기술 되어야 하는 형태. 속성값을 생략할 수 없게 된다.

노테이션(NOTATION)

Notation이란 XML파서나 해석할 수 없는 데이터형으로, 해당 XML문서를 처리하는 애플리케이션이나 파서에게 특정 해석할 수 없는 비문자 데이터를 어떻게 처리하라는 지시자로 생각하면 된다. 비문자 데이터란, 그림, 동영상, 음악 등의 형태의 자료로서 이들 자료에 대해 xml에 기술할 때, 해당 자료를 해석할 수 있는 프로그램 명도 같이 지정해주는 것이 Notation의 역할이다. 사용방법은 매우 간단한데 아래와 같다.

<!NOTATION 노테이션명 PUBLIC "PUBLIC식별자" SYSTEM "데이터를 처리할 응용프로그램 경로">

위에서 PUBLIC "PUBLIC 식별자"는 생략이 가능하다. 다음은 PUBLIC식별자의 예이다.

<!NOTATION gif PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN" SYSTEM "painter.exe">

간단하게 다음과 같은 표현이 주로 사용된다.

<!NOTATION gif SYSTEM "painter.exe">

NOTATION이 사용되는 곳으로는 속성으로 기술되거나 외부언파스드엔티티를 위해 사용된다.

관련글 더보기