A사와 B사에서 정보전달을 위한 목적으로 XML을 사용하기로 했다. 하지만 어떻게 A사와 B사 모두 같은 문법을 사용한 XML문서를 작성하도록 할 수 있을까? 그것은 문법과 유형을 정의하고있는 DTD 문서를 작성하여, 두 회사에서 해당 DTD문서를 사용해 XML문서를 작성하게 하면 된다. 특정 DTD문서에서 정의한 문법에 어긋난 XML문서는 XML Parser가 해석할 때 에러를 출력하도록 할 수 있다..
텍스트 선언
xml문서와 마찬가지로 DTD문서의 최상단에는 텍스트 선언이라고 해서 다음과 같은 문장이 위치해야한다.(생략할 수 있다.)
<?xml version="버전" encoding="인코딩방식"?>
<?xml version="1.0" encoding="euc-kr"?>
생략시 Default 값은 '1.0', 'utf-8' 이다.
주석
<!-- -->로서 xml과 동일하다.
엘리먼트
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나 자식엘리먼트를 기술 할 때는 반드시 괄호'(', ')'에 포함되어야 한다.