엘리먼트에 속성을 만들기 위한 문법으로는 아래와 같으며, 아래의 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이 사용되는 곳으로는 속성으로 기술되거나 외부언파스드엔티티를 위해 사용된다.