A사와 B사에서 정보전달을 위한 목적으로 XML을 사용하기로 했다. 하지만 어떻게 A사와 B사 모두 같은 문법을 사용한 XML문서를 작성하도록 할 수 있을까? 그것은 문법과 유형을 정의하고있는 DTD 문서를 작성하여, 두 회사에서 해당 DTD문서를 사용해 XML문서를 작성하게 하면 된다. 특정 DTD문서에서 정의한 문법에 어긋난 XML문서는 XML Parser가 해석할 때 에러를 출력하도록 할 수 있다..
텍스트 선언
xml문서와 마찬가지로 DTD문서의 최상단에는 텍스트 선언이라고 해서 다음과 같은 문장이 위치해야한다.(생략할 수 있다.)
xml 문서에서 사용할 엘리먼트를 선언하기 위해서는 <!ELEMENT>를 사용한다. xml은 대소문자를 구분하기 때문에, 'ELEMENT'는 반드시 대문자로 기술하여아한다.
<!ELEMENT 엘리먼트명유형>
엘리먼트명의 작성 규칙은 다음과 같다.
'xml', 숫자, 특수문자('_'문자는 제외)로 시작할 수 없다.
두번째 문자 부터 '_', '.', '-' 문자와 숫자를 사용할 수 있다.(':' 문자도 사용할 수 있지만, 네임스페이스 선언과 중복되므로 사용을 권장하지 않는다.)
공백이 포함될 수 없다.
유형에 사용될 수 있는 것들은 다음과 같다.
#PCDATA : 문자 데이터만을 가짐. '<!ELEMENT person (#PCDATA)>'는 xml문서에서 다음을 허용한다. <!-- CDATA섹션을 데이터로 가지는 엘리먼트--> <person><![CDATA[hellow]]></person>
EMPTY : 데이터를 가지지 않음. <!ELEMENT person EMPTY> 이 유형을 가진 엘리먼트는 xml문서에서 다음과 같은 사용만 허용한다. <person></person> 또는 <person />
ANY : 모든 엘리먼트와 문자데이터를 가질 수 있음. '<!ELEMENT person ANY>'는 모든 엘리먼트와 데이터의 사용을 허용하게 된다.
자식 엘리먼트 : 지정한 자식엘리먼트만 가질 수 있음. 기술한 자식엘리먼트를 가질 수 있게 한다. 자식엘리먼트 리스트의 기술에는 패턴규칙이 적용될 수 있다. 즉, '?', '*'. '+'. '|', ',' 등의 패턴과 결합해 다양한 표현을 할 수 가 있다. 1. 반드시 기술한 순서대로 자식엘리먼트가 작성되도록 하는 ',' 연산자 -DTD문서 내용 <!ELEMENT person (name, gender)> <!ELEMENT name (#PCDATA)> <!ELEMENT gender (#PCDATA)> -XML문서내용 <person> <name>이하늬</name> <gender>Female</gender> </person> 2. 자식 엘리먼트의 반복 숫자를 제어할 수 있도록 해주는 '?', '*', '+' 연산자 - ? : Zero or One - * : Zero or More - + : One or More 의 의미를 가지고 있다. 따라서 다음과 같이 다양하게 표현할 수 있다. -DTD문서 내용 <!ELEMENT person (name, age?, nickname+, (schoolname, graduated)*)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT nickname (#PCDATA)> <!ELEMENT schoolname (#PCDATA)> <!ELEMENT graduated (#PCDATA)> -XML문서내용 <person> <name>이시향</name> <age>16</age> <nickname>너구리</nickname> <nickname>이썅</nickname> </person> 3. 리스트 중 하나만 선택해서 작성할 수 있도록 해주는 '|' 연산자 -DTD문서 내용 <!ELEMENT person (name, (brother|sister)*)> <!ELEMENT name (#PCDATA)> <!ELEMENT brother (#PCDATA)> <!ELEMENT sister (#PCDATA)> -XML문서내용 <person> <name>정순영</name> <sister>정순화</sister> <brother>정순철</brother> <sister>정순지</sister> </person>
혼합형태 : 아무 데이터나 자식을 가지지 않거나, 지정한 자식엘리먼트, 문자데이터 등 모두 가질 수 있는 형태 <!ELEMENT person (#PCDATA | child1 | child2 | childN)*> 위와 같이 사용할 수 있지만 다음과 같은 주의사항이 있다. - 문자데이터를 포함할 수 있도록 하기위해 #PCDATA는 반드시 젤 첫번째 위치에 존재해야한다. - 괄호 마지막에 '*'은 반드시 존재해야한다. - 리스트 사이에는 반드시 '|'연산자를 사용해야한다.
주의사항 : ANY나 EMPTY가 아닌 #PCDATA나 자식엘리먼트를 기술 할 때는 반드시 괄호'(', ')'에 포함되어야 한다.