미니의 글은 다음과 같이 출처를 밝히시면 가져가서 활용할 수 있습니다.
[출처 : 미니의 XML DeveloperGroup (http://www.word.pe.kr)]

4. DTD란?

  요새 냉방병에 눈병이 심하다고 하네요.. 저도 어째 눈이 좀 안좋아서 안과에 다녀왔네요.. 모두들 뜨거운 여름에 몸 조심하세요.. 그리고 제가 여기에 올리는 강좌는 초보자를 위한 글입니다. 첨 홈페이지를 제작할 때는 XML에 관심이 많아서 많은 분들이 찾아왔었지만, 지금은 XML의 기본사항은 마치 HTML처럼 널리 알려진 내용이 되었네요.. 그래도 또 다시 새롭게 시작하는 분들을 위해서 이 글을 정리해 놓습니다. *^^*

자 그럼 시작해 볼까요?

DTD는 XML 문서에 사용될 구성요소를 정의해 놓은 것으로 생각하면 됩니다. Document Type Definition

그런데 생각보다 DTD는 좀 어렵습니다. 만약 DTD를 설계해야 한다.. 그러면 더욱이 어려워지죠.

제 생각에 초기 DB를 설계하기 위해서 DBA가 필요했던 것처럼 XML에서 DTD를 설계하는 사람도 필요해지겠죠..

그러나 차이는 조금 있습니다. DB를 사용하려면 누구나 DB의 스키마를 정의해야 하지만..

XML을 사용하기 위해서는 DTD를 정의하기 보다는 기존에 정의된 DTD를 가져다가 사용하는 경우가 많이 발생하겠죠.

당연하죠.. 왜냐면 만약 누구나 자기 DTD만 정의해서 사용한다면 그 DTD가 가치를 지닐수 있을까요???

실제로 보면 DTD는 W3C나 기타 XML 관련 기관에서 발표되고 있고 표준화되고 있습니다.

그렇다면 우리의 공부 방향은 어디냐?? 물론 지금 이글을 보시는 분중에서는 DTD를 설계할 필요가 있으신 분도 있겠죠.

그러나 대부분은 DTD를 이해만 하면 될 겁니다. 그래서 오늘은 DTD와 XML에서 가장많이 사용되는

엘리먼트와 속성의 선언에 대해서만 알아보도록 하겠습니다.

DTD의 필요성

HTML에서 <font>라는 태그를 사용했을 때 우리는 <font>가 글자의 글꼴, 색깔, 크기등과 관련이 있다는 것을 잘 알고 있습니다.

우리가 이걸 어떻게 이해하느냐? 그것은 HTML DTD에 <font>태그는 이러이러한 것이고 속성으로는 뭘 가질수 있고..

등등의 정보가 표현되어 있기 때문입니다.

앞에서 설명했듯이 한 공동체에서 이러한 태그를 공유해 특정 부분을 정보화 할 경우 해당 정보의 가치는 더욱 높아질 것입니다.

왜냐하면 그러한 문서는 사람뿐만 아니라 컴퓨터도 쉽게 해석할 수 있고 공동체 내에서 자유롭게 변환이나 이동이 가능하기 때문입니다.

그렇다면 이러한 태그정보를 어떻게 공유할 수 있는가? 계속되는 같은 질문이죠. ^^:;

바로 DTD를 이용해서입니다. DTD의 개념은 XML 이전인 SGML에서부터 존재했습니다.

SGML에서 사용되던 DTD를 간략화 해서 XML에서 사용하게 되었지요. 그래서인지 DTD는 몇가지 문제점을 가지게 되었습니다.

첫째로 DTD에서 정의된 엘리먼트나 속성의 값이 가지게 될 타입을 정의할 수 없습니다.

즉, 정수형, 문자형, 날짜형.. 등등의 변수의 타입을 지정할 수 없는 것입니다. 그래서 DTD가 수행하는 중요한 기능중의 하나인

Validation Check(유효성검사)에서 보다 더 정밀하게 검사할 수 없게 되는 거지요.

둘째로는 DTD문서가 XML문서의 형태가 아니므로 XML 에디터 이외에 또다른 DTD 에디터를 필요로 한다는 것입니다.

이것은 XML과 DTD를 따로 배워야 한다는 문제도 발생시키죠.

그래서… 새롭게 XML 형식의 DTD를 정의하면서 타입도 지정할 수 있는 것이 등장했습니다.

그게 바로 XML Schema입니다. 참 공부하기 어렵죠.. 하나 해두면 또 하나 나오고.. 윽~~~

관심있으신 분은 W3C의 홈페이지에 가서 확인해 보시길 바랍니다. 여기서는 그냥 DTD 이야기만 하죠.

여러분이 알고 있는 HTML, WML, SMIL등등이 각각 자신의 DTD를 가지고 있는 XML 문서라고 보면 됩니다.

그럼 DTD의 구성요소를 하나씩 살펴보도록 할까요? 그러기 위해서 지난번 예제를 다시 사용하도록 하죠. <?xml version=“1.0”?>

<html>

   <head>

      XML Developer

   </head>

   <body>

     <img src=“xml.gif”/>

     <a href=“http://xmlis.pe.kr”>Hello World</a>

   </body>

</html>

엘리먼트의 선언

DTD에서 엘리먼트를 선언하는 형식은 다음과 같습니다. <!ELEMENT 이름 내용>

이름은 사용될 엘리먼트의 이름을 나타내고요. 내용은 자식으로 나타날 수 있는 것들을 적어주면 됩니다.

자 그럼 위의 예에서 <body>태그를 DTD에서 정의한다고 해보죠..

이름은 당연히 body가 되겠죠. 그리고 내용은 <body>와 <body>사이에 나타나는 것을 적어주면 됩니다.

그것이 바로 자식으로 나오는 것이죠.. 위에서 보면 <img>태그와 <a>태그가 나타나고 있죠.

그런데.. <img>나 <a>태그는 순서가 바뀌어도 되고, 또 여러번 나올수도 있다고 합시다.

<body><img…><img…><a…><img…></body>

뭐 이런형태로 나올수 있다고 가정해보죠.. 그런 경우 DTD 선언은 다음과 같이 할 수 있습니다.

이름 : body

내용 : img 또는 a가 여러번 발생 <!ELEMENT body (img|a)*>

위와 같은 형태로 작성이 가능합니다. 휴~~ 어렵죠.. 좀만 더 참고 보세요..

여기에서 어렵게 느끼는 이유는 못보던 것이 나와서입니다. |나 *같은 기호죠.. 다음 표를 참고하세요.

|

 엘리먼트 내용이 선택적으로 나타날 수 있다.

,

 엘리먼트 내용이 순서대로 나타나야 한다.

?

 엘리먼트 내용의 출현회수가 생략되거나 한번 나타난다.

*

 엘리먼트 내용의 출현회수가 생략되거나 여러번 나타난다.

+

 엘리먼트 내용의 출현회수가 최소 한번 이상 나타난다.

 엘리먼트 내용의 출현회수가 한번만 나타난다.

무슨 이야긴지 아시겠어요?? 혹 추가적인 설명이 필요하면 Q&A를 이용하시거나 저한테 멜 주세여..

자 이해하기 쉽도록 몇 개 더 해보죠.

<head>와 같은 걸 선언을 한다고 해보죠.. 이름은 head 내용은 어라?? 그냥 문자열이죠.

XML에서는 이러한 것을 #PCDATA라고 부릅니다. 파싱된 문자 데이터라나요?? 단순한 문자열로 인식하면 됩니다.

다만 그 문자열이 XML 문서을 읽을 때 파싱된다는 의미를 가지고 있습니다.

이름 : head

내용 : #PCDATA 가 한번만 출현한다. <!ELEMENT head (#PCDATA)>

뒤에 아무런 기호도 안 붙었죠. 위의 표에서 맨 마지막 것입니다.

그런데.. XML에서 <img>와 같은 태그는 내용을 포함하지 않는 엘리먼트라고 지난번에 설명했죠..

그걸 뭐라고 했죠??? 빈 엘리먼트(Empty Element)라 그랬죠.

문제는 그겁니다. 내용이 없는데 <img>는 어떻게 정의할 수 있을까?? <!ELEMENT 이름 EMPTY>

이렇게 하면 되겠죠.?? 적용시켜 보면

  <!ELEMENT img EMPTY>

휴~~ 엘리먼트에 대해서 이정도로 해두죠.. 어렵나요? 아마 첨 보는 분은 어려울 겁니다.

우리가 무엇이든 시작하려 할 때 가장 어려운 것은 용어라고 생각합니다. 머리에 들어오지 않는 용어가 문제죠.

그런 경우라면 자주 보세요.. 그 방법밖에는 달리 추천할 방법이 없네요.. T__T

속성의 선언

DTD에서 속성을 선언하는 형식은 다음과 같습니다. <!ATTLIST 엘리먼트이름 속성이름 속성형 (속성기본값)>

엘리먼트이름은 속성을 포함할 엘리먼트의 이름을 나타내고요. 속성이름은 속성의 = 왼쪽에 나타나는 이름이고요.

속성형은 속성이 가질수 있는 타입이고, 속성기본값은 속성의 필요여부등을 나타냅니다.

속성형과 속성기본값은 아래와 같이 정리할 수 있습니다.

속성형

선언형태

설명

문자열 속성

 CDATA

 일반적인 문자열

토큰 속성

 ID

 엘리먼트의 ID

 IDREF

 엘리먼트의 ID를 가리키는 포인터

 IDREFS

 하나이상의 IDREF들

 ENTITY

 외부 엔터티를 가리키는 포인터

 ENTITIES

 하나 이상의 엔터티 값들

 NMTOKEN

 토큰 문자열

 NMTOKENS

 하나 이상의 토큰 문자열들

열거 속성

 (값1 | 값2 | 값3 | …)

 선택 가능한 값을 목록으로 나타냄

속성의 기본값

설명

 #REQUIRED

 속성값이 반드시 필요한 속성이다.

 #IMPLIED

 속성값이 지정되지 않은 경우 XML 프로세서가 암시적으로 할당한다.

 #FIXED

 속성값이 DTD에 지정된 값과 반드시 같아야 한다.

여기까정입니다. 휴!~ 내가 읽어봐도 몬 소린지 하는지.. 쩝.

예를 하나만 들어보죠. 위에서 <img>태그가 있었습니다. <img>태그의 src 속성을 선언한다고 해보죠..

엘리먼트이름 : img

속성이름 : src

속성형 : 문자열 속성 (CDATA)

속성기본값 : 필요함

  <!ATTLIST img src CDATA #REQUIRED>

이런형태로 사용됩니다.

속성과 관련된 선언도 이정도로만 하겠습니다.

DTD에는 더 많은 구성요소가 있습니다. 하지만 일단 현 강좌가 기초이고 저의 실력도 삐리리 한 만큼 여기까지만 하겠습니다.

대신에 다음 강좌에서는 MS사이트에 예제로 나와있는 음반과 관련된 아주 간단한 DTD가 있습니다.

오늘 배운 엘리먼트와 속성만 나와 있죠. 그걸 가지고서 XML 문서를 만들어 가는 예제를 해보려구 합니다.

그것이 DTD와 관련된 구성요소를 계속 설명하는 것보다는 훨씬 나을 것 같아서요..

Comments are closed.

Post Navigation