티스토리 뷰

XML Developer/XML기초

1.5 XML & DTD

미니~ 2002. 8. 2. 22:40

오늘은 지난번에 하겠다고 했던 DTD 예제를 가지고 XML문서로 만들어 가는 걸 설명해 드리려고 합니다.



오늘 예제는 제가 MS 사이트에서 가져온 것으로 일반적인 음악 CD에 대한 항목을 나타내는 예제입니다. 해당 소스는 자료모음 에서 받으실 수 있습니다.



먼저 이 문서의 DTD를 살펴보도록 하죠.

1: <!ELEMENT compactdiscs (compactdisc*)>
2:     <!ELEMENT compactdisc (artist, title, tracks, price)>
3:           <!ENTITY % Type "individual | band">
4:           <!ELEMENT artist (#PCDATA)>
5:                  <!ATTLIST artist type (%Type;) #REQUIRED>
6:           <!ELEMENT title (#PCDATA)>
7:                  <!ATTLIST title numberoftracks CDATA #REQUIRED>
8:           <!ELEMENT tracks (track*)>
9:           <!ELEMENT price (#PCDATA)>
10:         <!ELEMENT track (#PCDATA)>





위의 DTD는 다행히도 제가 지난 강좌에서 설명한 엘리먼트와 속성으로 이루어져 있습니다.

실제로 여러 DTD를 보면 무지무지 복잡하게 되어 있습니다. 그러나 기본적으로 꼭 알아야 하는 것이

바로 엘리먼트와 속성입니다. 이 두가지만 잘 파악하고 있으면 어떤 DTD에도 빠르게 적응할 수 있을 겁니다.

번호는 설명을 위해서 제가 붙여놓은 것입니다. 실제 DTD에는 번호가 붙지 않습니다.



여러분이 소스를 테스트 하시려면 반드시 "1:" 이 부분을 모두 삭제하고 사용하시기 바랍니다.



DTD를 한번 쭉 살펴 볼까요?

어라!! 잉~~ 모르는 것이 중간에 하나 끼어 있네요..



3번줄을 보세요... ENTITY라?? 분명 XML 구성요소를 할 때는 설명이 나왔는데 DTD에는 설명이 없었죠.

자~ XML 구성요소에서 설명한 것으로 생각을 해보세요. ENTITY는 텍스트나 Binary 데이터, 비 ASCII 문자열을 대치한다고 했죠.

생각 나세요.. 쿠쿠 제 강좌를 참 잘 따라온 분이네여~~ 생각이 안나시는 분은 앞부분을 참고하세요.



엔터티는 XML 문서에서 사용될 수도 있지만 DTD문서에서도 사용될 수 있습니다.

DTD 문서에서 사용되는 엔터티를 파라미터 엔터티라고 하죠.

우리가 XML에서 엔터티를 사용할 때 < & & 이런 형태로 사용했죠..

DTD에서는 %lt; % %amp;라고 사용을 합니다. 좀 다르죠.. 의미는 거의 비슷하다고 보면 됩니다.



자 그럼.. 위에서 <!ENTITY % Type "individual | band">



은 Type이란 엔터티를 "individual | band"로 바꿔라 라는 의미로 해석하면 됩니다.



그럼 Type이 사용된 곳을 보죠.. 5번째 줄에 보면 %Type; 이란 부분이 있죠. 그부분을 바꿔 주면 됩니다.

즉, 위와 같은 경우 다음 두줄을 이렇게 한줄로 바꿀 수 있습니다. 의미는 같네요.

<!ENTITY % Type "individual | band">

<!ATTLIST artist type (%Type;) #REQUIRED>


<!ATTLIST artist type (individual | band) #REQUIRED>



실제로 소스를 다운 받아서 바꿔서 사용해 보세요. 당연히 됩니다.

참고 : 지난번처럼 하면 안됩니다. 송선희님이 지적해 주셨네요.. 감사합니다. 새롭게 고쳐 놓았습니다.

          %Type; => individul|band 로 바꾸는 거네요. 그래서 위처럼 하셔야 합니다.

          실제로도 XML 스펙에 보면 위와 같은 속성 타입을 열거형이라고 하는데요.

          열거형은 ()로 둘러쌓여 있구요.. |로 구분한다 라고 나와있네요. 죄송함다.. 제가 미리 체크하지 못했네요 T__T



그럼 여기서 당근 질문을 하나 하셔야 합니다. 왜 파라미터 엔터티를 사용하느냐?



그냥 직접 쓰면 되는데?? 그건 우리가 C나 C++에서의 #define을 사용하는 이유와 같습니다.

위에서 Type에 하나가 추가되었다고 보죠. 즉, 지금은 개인과 밴드만이 존재하는데.. 만약 듀엣이 추가된다면??

DTD 전체를 바꿔야겠죠..



그게 복잡한 DTD라면 더욱 머리가 아파지는 거지요.. 하지만 엔터티를 사용했다면 엔터티 선언 부분만 바꾸면 됩니다.

당연히 엔터티의 효용도가 높아 지겠죠. 실제로 많은 DTD가 이 엔터티를 주로 사용합니다.



자, 그럼 계속 가 볼까요?? 우리가 할 일은 위의 DTD를 보구서 XML 문서 하나를 만들어 가는 겁니다.

1번줄을 보세요. <compactdiscs>는 <compactdisc>를 여러번 포함할 수 있습니다.
 
<!ELEMENT compactdiscs (compactdisc*)>

제가 어떻게 여러번 포함될 수 있다는 것을 알았을까요? 그것은 * 때문입니다. 이런 기호들의 의미가 지난 강좌에 소개 됬었죠.



그렇다면 다음처럼 만들어 줄 수 있을 겁니다.

<compactdiscs>

    <compactdisc>

    ...

    </compactdisc>

    <compactdisc>

    ...

    </compactdisc>

</compactdiscs>





그리고 나서 2번의 <compactdisc>를 살펴보죠..


<!ELEMENT compactdisc (artist, title, tracks, price)>


(artist, title, tracks, price)  이렇게 나와 있습니다. 맨 뒤에 아무것도 없으니까 1번 나타난다는 의미고요.

, 로 되어 있으니까 순서대로입니다. 지난번 강좌와 연결해서 이해가 되나요??



그러므로 <compactdisc>는 <artist>, <title>, <tracks>, <price>가 순서대로 나타난다고 보시면 됩니다.

<compactdisc>

    <artist></artist>

    <title></title>

    <tracks></tracks>

    <price></price>

</compactdisc>





자 여기까지 별 어려움이 없죠.. 계속 가보죠..

4번째 줄을 보면 <artist>는 #PCDATA를 가지고 있습니다. <!ELEMENT artist (#PCDATA)>



#PCDATA가 뭐였죠? 파싱된 문자데이터.. 그냥 문자열로 생각하면 편하다고 했죠.

즉, <artist>는 문자열을 자식으로 가지고 있고요.



이어서 5번째 줄을 보세요. <artist>는 속성을 포함하고 있다고 나와 있죠..


<!ATTLIST artist type (%Type;) #REQUIRED>


속성의 이름은 type이고 파라미터 엔터티를 문자열로 바꾸면 "individual | band" 이므로 열거형으로 둘중의 하나를 값으로 가져야 하고요.

그리고 반드시 필요한 속성이라는 것이죠.. 4,5번을 종합해 보면 다음과 같이 작성해야 한다는 거네요..

<artist type="individual">Frank Sinatra</artist>





6번째와 7번째 줄의 <title>도 비슷합니다. <!ELEMENT title (#PCDATA)>
    <!ATTLIST title numberoftracks CDATA #REQUIRED>





자식으로 CD제목을 나타내는 문자열(#PCDATA)를 가지고 있구요. 속성은 문자열 속성을 가진 numberoftracks가 있습니다.

다음과 같은 형태로 작성하면 되죠..

<title numberoftracks="4">In The Wee Small Hours</title>





여기서 잠시 생각할 것이 numberoftracks의 값은 분명 숫자일 것입니다. 그러나 제가 지난번에 설명했듯이 DTD에서 숫자형이란

데이터 타입은 없습니다. 그냥 모두 문자열일 뿐입니다.



8번째 줄과 10번재 줄을 보면 <tracks>는 여러개의 <track>을 포함할 수 있고 <track>은 내용으로 문자열을 넣어주면 됩니다.

<!ELEMENT tracks (track*)>
    <!ELEMENT track (#PCDATA)>





적용해 볼까요? 이런 형태로 사용할 수 있습니다.

<tracks>

    <track>In The Wee Small Hours</track>

    <track>Mood Indigo</track>

    <track>Glad To Be Unhappy</track>

    <track>I Get Along Without You Very Well</track>

</tracks>





마지막으로 9번째 줄을 보면 <price>는 가격 정보를 나타내는 문자열로서 다음처럼 작성하면 됩니다.

<price>$12.99</price>



여기에 XML 문서 선언 부분을 넣구요. DTD를 선언하는 부분도 넣어서 다음처럼 완성할 수 있습니다.

  <?xml version="1.0"?>
<!DOCTYPE compactdiscs SYSTEM "cds.dtd">
<compactdiscs>
  <compactdisc>
    <artist type="individual">Frank Sinatra</artist>
    <title numberoftracks="4">In The Wee Small Hours</title>
    <tracks>
          <track>In The Wee Small Hours</track>
          <track>Mood Indigo</track>      
          <track>Glad To Be Unhappy</track>
          <track>I Get Along Without You Very Well</track>
    </tracks>
    <price>$12.99</price>
  </compactdisc>
  <compactdisc>
    <artist type="band">The Offspring</artist>
    <title numberoftracks="5">Americana</title>
    <tracks>
           <track>Welcome</track>
           <track>Have You Ever</track>  
           <track>Staring At The Sun</track>
           <track>Pretty Fly (For A White Guy)</track>
    </tracks>
    <price>$12.99</price>
  </compactdisc>
</compactdiscs>





DTD가 주어졌을 때 XML 문서를 생성하는 방법을 간단하게 알아보았습니다. 이것을 통해서 DTD를 좀더 편하게 보았으면 해서

제가 강좌로 마련해 보았네요.



실제로 여러분에게 DTD가 주어졌을 때 이런 형식으로 적용할 수 있다면 앞으로 다가올 웹의 변화에 빠르게 적응할 수 있을 겁니다.

왜냐면 지금 시작되고 있는 웹의 변화는 XML을 기반으로 한 DTD에 있다고 볼 수 있으니까요? 넘 거창했나요?? ^^;;

어쨌거나 반대로 만약 XML 문서를 새로이 받았을 때 이 DTD를 공유하고 있다면 의미해석을 더욱 쉽게 할 수 있을 겁니다. 2002/08/02  From 미니

2002/08/01 - [XML Developer/XML기초] - 1.1 XML이란?
2002/08/02 - [XML Developer/XML기초] - 1.2 XML의 시작
2002/08/02 - [XML Developer/XML기초] - 1.3 XML의 구성 요소
2002/08/02 - [XML Developer/XML기초] - 1.4 DTD란?
2002/08/02 - [XML Developer/XML기초] - 1.5 XML & DTD
2002/08/02 - [XML Developer/XML기초] - 1.6 XSL & XML
2002/08/02 - [XML Developer/XML기초] - 1.7 마치면서

'XML Developer > XML기초' 카테고리의 다른 글

1.7 마치면서  (0) 2002.08.02
1.6 XSL & XML  (0) 2002.08.02
1.5 XML & DTD  (0) 2002.08.02
1.4 DTD란?  (0) 2002.08.02
1.3 XML의 구성 요소  (0) 2002.08.02
1.2 XML의 시작  (0) 2002.08.02
TAG
,
댓글
댓글쓰기 폼