XML에서는 고유하게 태그를 도입할 수 있다.
XML에서는 어떠한 시작 태그, 종료 태그, 공 엘리먼트 태그가 사용되고 어떠한 속성이 사용되는 가를 문서형 정의라는 구조에 의해 규정하는 것이 가능하다.
다시 말하면 한 개의 문서형 정의는 한 개의 마크업 언어를 규정한다. 문서형 정의는 영어로 Document Type Definition(DTD) 이다.
<!ELEMENT 진료기록 (환자, 진료일시, 치료)>
<!ELEMENT 환자 (성, 이름)>
<!ATTLIST 환자 성별 CDATA#REQUIRED
연령 CDATA#REQUIRED
보험증번호 CDATA#REQUIRED
>
<!ELEMENT 성 (#PCDATA)>
<!ELEMENT 이름 (#PCDATA)>
<!ELEMENT 진료일시 EMPTY >
<!ATTLIST 진료일시 년 CDATA#REQUIRED
월 CDATA#REQUIRED
일 CDATA#REQUIRED
>
<!ELEMENT 치료 (투약*, 주사*)>
<!ELEMENT 투약 (#PCDATA)>
<!ELEMENT 주사 (#PCDATA)>
1. 엘리먼트형 선언
엘리먼트형 선언은 엘리먼트의 형을 정의하는 것이다.
엘리먼트형 선언에 정의된 엘리먼트형은 시작 태그와 종료 태그의 이름으로서 사용하는 것이 가능하다.
엘리먼트형 선언은 '<!ELEMENT'로 시작하고, 엘리먼트형 내용 모델이 오고 '>'로 끝나는 텍스트이다. 예를 들면 위 예의 1행에 있는 엘리먼트형 선언에서는 엘리먼트형이 '진료기록', 내용 모델이 '(환자, 진료일시, 치료)'이다.
이 선언에 의해서 <진료기록>이라는 시작 태그, </진료기록>이라는 종료 태그가 사용된다.
시작 태그 <진료기록>에서 종료 태그 </진료기록>까지의 텍스트에 의해 표현되는 엘리먼트 내용은 엘리먼트형 '진료기록'에 속한다.
내용 모델은 정의된 엘리먼트형에 속하는 엘리먼트가 어떠한 내용을 갖는가를 기술한다. 이 예에서는 엘리먼트형 '진료기록'에 속하는 엘리먼트의 내용은
엘리먼트형 '환자'에 속하는 엘리먼트
엘리먼트형 '진료일시'에 속하는 엘리먼트
엘리먼트형 '치료'에 속하는 엘리먼트
의 3가지가 이 순서로 병행하여 오는 것을 나타낸다.
다음의 엘리먼트형 선언은 내용 모델 중에 "*"가 사용된다.
<!ELEMENT 치료 (투약*, 주사*)>
이는 0번 이상 반복됨을 나타낸다. 그래서 엘리먼트형 '치료'에 속하는 엘리먼트의 내용은 먼저 엘리먼트형 '투약'에 속하는 엘리먼트가 0번 이상 사용되고, 다음에 엘리먼트형 '주사'에 속하는 엘리먼트가 0번 이상 사용된다.
추가로 만일 '*' 대신 '+'가 사용되면 1번이상 올 수 있음을 나타내고, '*', '+'가 없으면 한번 올 수 있음을 나타낸다.
내용으로 태그 이외의 문자열만을 갖는 엘리먼트의 경우, 엘리먼트형 선언은 다음과 같이 된다.
<!ELEMENT 성 (#PCDATA)>
내용 모델 (#PCDATA)는 일반 문자열을 나타낸다. 즉, 엘리먼트형 '성'에 속하는 엘리먼트의 내용은 간단한 문자열인 것을 나타낸다.
다시 말하면 시작 태그 <성>과 종료 태그</성> 사이에는 간단한 문자열만이 오는 것을 나타낸다.
마지막으로 키워드 EMPTY를 사용한 엘리먼트형 선언을 나타낸다.
<!ELEMENT 진료일시 EMPTY>
이와 같이 선언된 엘리먼트형에 속하는 엘리먼트는 내용을 갖지 않는다.
공 엘리먼트 태그로 표현하면 시작 태그의 직후에 종료태그를 위치하여 표현한다.
이러한 경우, 목록이나 그림, 수식등을 표현할 때도 이와 같이 선언하여 사용할 수 있다.
2. 속성 목록 선언
속성 목록 선언은 어느 엘리먼트형에 속하는 엘리먼트에 대해 이것이 어떠한 속성을 갖는가 정의하는 것이다. 위의 DTD는 다음 속성 목록 선언을 포함한다.
<!ATTLIST 환자
성별 CDATA#REQUIRED
연령 CDATA#REQUIRED
보험증번호 CDATA#REQUIRED
>
위 속성 목록 선언은 엘리먼트형 '환자'를 나타내는 시작 태그는 3개의 속성을 갖는 것으로 규정한다.
속성명 '성별'과 값, 속성명 '연령'과 값, 속성명 '보험증번호'와 값의 3개이다. 다음의 시작 태그는 이 속성 목록 선언에 따른다.
<환자 성별="남" 연령="38" 보험증번호="12345">
3. 문서형 선언과 올바른(valid) XML 문서
XML 문서는 문서형 선언이라는 구성에 의해 DTD를 참조한다.
예를 들면 루트 엘리먼트의 엘리먼트형이 '진료기록'인 DTD가 C드라이브 바로 아래 record.dtd.라는 파일로 저장되어 있다고 하자.
이것을 참조하기 위해 문서형 선언을 다음과 같이 표시한다.
<!DOCTYPE 진료기록 SYSTEM file:///C:/record.dtd>
문서형 선언은 XML 선언의 바로 아래에 위치한다.
위의 예에서 DTD는 파일로 저장하지만 URL로 참조가능 하므로 네트워크상의 어떠한 위치에도 가능하다.
이 경우 다음과 같이 문서형 선언을 쓴다. 여기서 'SYSTEM'은 해당 DTD가 현재 사용하고 있는 시스템내에 있음을 말하며, 이 대신 'PUBLIC'를 사용하면 이미 공용화된 파일을 참조함을 나타낸다.
<!DOCTYPE 진료 기록 SYSTEM http://Web.medical.ac.kr/record.dtd>
문서형 선언을 갖고 문서형 선언으로 지정된 DTD에 따르는 XML 문서를 '올바른 XML 문서'라 한다.
4. 적정 형식(well-formed)의 XML 문서
XML 에서는 문서가 DTD를 갖지 않아도 인식할 수 있다.
이와 같은 문서를 '적정 형식의 XML 문서'라 한다.
또한 DTD를 갖는 문서에서도 DTD에 따르지 않는 것이 XML 에서는 허용된다.
예를 들면 DTD에 선언되지 않은 엘리먼트형을 사용하는 것이 허용된다. 이와 같은 문서도 적정 형식의 XML 문서이다.
적정 형식의 문서는 문서형 선언을 갖고 있어도 갖지 않은 구성을 할 수 있다.
갖는 경우도 문서형 선언에 지정된 DTD에 따를 필요는 없다. 그러나 필요한 XML의 구문 규칙에 따르는 것이다.
결국 시작 태그와 종료 태그 형식이 올바른 것, 시작 태그를 갖는 속성의 형식이 올바른 것, 시작 태그와 종료 태그의 대응이 올바른 것 등이다.
DTD에 따라서 작성된 올바른 XML 문서에서도 WWW으로 배포된 기존에 편집되지 않은 것이 고려된다.
이 경우 DTD까지 WWW으로 배포될 필요는 없다. 즉, 서버 측에는 올바른 XML 문서이지만 클라이언트 측에는 적정 형식의 XML 문서로
사용된다.

