본문 바로가기

학습컨텐츠/XML

XML다루기 - 4. DTD로 마크 업 언어 만들기

XML이란 마크 업 언어를 만드는 메타언어라고 앞에서 얘기했습니다. 그러면 어떤 방식으로 새로운 마크 업 언어를 만들 수 있을까요? 바로 DTD(Document Type Definition)를 이용하는 것입니다. 여기서 잠깐 유효한(Valid) 문서라는 개념을 소개하겠습니다.


Well-formed 문서와 Valid 문서

XML문서는 DTD의 포함 여부에 따라서 Well-formed 문서와 Valid문서로 나눌 수 있습니다.

XML 스펙을 보면 XML 문서가 갖추어야 할 조건들을 설명하고 있습니다. 어떤 XML문서가 그 조건을 잘 지키고 있다면 그 문서를 Well-formed라고 하는 것이지요. 모든 tag는 시작과 끝이 있어야 한다 는 것은 그러한 조건 중 한 예입니다.
그렇다면 Valid 문서란 무엇일까요? 어떤 XML문서가 Well-formed하고 한가지를 더 지키고 있다면 바로 valid하다고 합니다. 그것은 바로 XML문서가 어떤 DTD가 정의한 대로 구성되어 있어야 한다는 규칙이지요.

정리하자면 우리는 DTD로 마크 업 언어를 만들 수 있고, 그렇게 만든 마크 업 언어가 정의하는 대로 XML문서를 만들 때, 그 문서를 valid하다고 하는 것입니다.


DTD제작 - XML선언

그럼 이제 DTD로 마크 업 언어를 만드는 방법을 배워볼까요?

우리가 XML문서에 대해 배운 것을 기억해 봅시다. 서두에는 XML선언, PI, 문서 유형 선언이 있었고, XML문서의 모든 엘리먼트는 속성을 가질 수 있었고, content로써 자식 엘리먼트와 문자데이터를 가질 수 있습니다.

일단 XML선언, PI, 문서 유형 선언 중에 *.dtd파일에 필요한 것은 XML선언뿐입니다. 방식은 XML문서와 동일합니다.


DTD제작 – 엘리먼트 선언

그리고 DTD에서 엘리먼트를 선언하는 방식은 다음과 같습니다.

1) content로 문자 데이터만을 갖는 엘리먼트 선언

<!ELEMENT 엘리먼트명 (#PCDATA)>

2) content로 자식 엘리먼트만을 갖는 엘리먼트 선언

<!ELEMENT 엘리먼트명 (자식엘리먼트1, 자식엘리먼트2, …)>

3) 그 외( content가 없는 엘리먼트 선언, 아무 content나 가지는 엘리먼트 선언) 등

…생략…


즉 위와 같은 선언을 함으로써, xml파일에서 특정 엘리먼트가 어떤 content를 가질 수 있는 것인지 정해주는 것입니다.

이제 한번 위에서 예시로 사용했던 booklist.xml파일의 문법을 정의하는 DTD파일을 한번 생각해 보세요. 정답은 아래와 같습니다.

<!ELEMENT booklist (book*)>
    <!ELEMENT book (title, author)>
        <!ELEMENT title (#PCDATA)>
        <!ELEMENT author (#PCDATA)>


간단하지요. 4개의 element를 정의해 주었습니다.

근데 아직 우리가 DTD에서 정의하지 않은 부분이 있습니다. 바로 엘리먼트의 속성입니다.


DTD제작 – 속성 선언

속성을 정의하는 방법은 아래와 같습니다.

<!ATTLIST 엘리먼트명
속성명1 속성유형 디폴트선언
속성명2 속성유형 디폴트선언
… >

속성유형에는 여러 가지가 있을 수 있지만 일단 우리는 문자형 데이트를 나타내는 CDATA만을 생각하도록 합시다.

디폴트 선언에는 엘리먼트 작성시 속성을 생략할 수 있는지, 아니면 반드시 기술해야 되는 것인지를 지정하게 됩니다. 그 종류는 아래와 같습니다.

종류

설명

#IMPLIED 

엘리먼트 작성시 속성을 생략할 있다.

#REQUIRED 

엘리먼트 작성시 속성을 반드시 기술해야 한다.

#FIXED 

속성값으로 지정한 문자열 이외의 값은 넣을 없다.

디폴트

속성이 생략되었을 경우, 기본 속성값으로 사용될 값을 기술한다.

이제 연습 삼아 위의 booklist.xml에서 사용한 속성을 정의해보도록 합시다. 정답은 아래와 같습니다.

<!ATTLIST book
        kind CDATA #REQUIRED>


여기서 우리는 한가지 질문을 던집니다. dtd를 이용해서 새로운 마크 업 언어를 정의하는 일이 자주 있는 작업일까요?

data를 XML을 이용하여 처리하고자 할 때 우리는 두 가지 방법을 쓸 수 있습니다. data를 알맞게 tagging, 분류할 수 있는 새로운 XML 문법을 만들어서 data를 처리하는 방법과 이미 있는 XML문법에 맞게 data를 tagging, 분류하는 방법입니다. 두 가지 방법 중 어느 방법이 주로 쓰일까요?

우리가 방금 dtd를 이용하는 것을 배운 것은 첫 번째 방법을 쓰기 위한 것이었지만, 사실 대부분의 경우 이미 좋은 dtd를 사람들이 충분히 정의해 놓았기에 우리는 그러한 dtd를 보고 그 dtd가 정의하는 markup language대로 data를 정리하는 xml을 제작하면 되는 것입니다.