본문 바로가기

카테고리 없음

DTD를 이용한 문서 구조 설계

1. DTD 개요

ㅁ DTD (Document Type Definition)

  - 새로운 마크업 언어를 정의 -> 문서/데이터의 구조를 정의

  - XML 문서에서 사용가능한 markup들의 집합과 사용 규칙을 정의

      ● 엘리먼트( + 속성 ) , 개체(entity), 노테이션(notation) 등

ㅁ 문서의 유효성

  - 특정 DTD에 따라 작성된 문서를 그 DTD에 대해 유효한 문서라 함

  - DTD를 이용해 XML 문서가 유효한 문서인지 확인 가능 (유효성검사)

 

2. DTD 사용 방법

 

ㅁ 문서 유형 선언(Document type declaration : DOCTYPE)

  - xml 문서가 어떤 DTD에 의해 (정의된 언어로) 작성된 것인지 문서 내에 명시

  - DTD는 내부 DTD subset ( : 서두 안에 선언 ) 과 외부 DTD subset으로 구별됨

  - 외부 DTD subset를 정의한 문서를 DTD 문서라 

● 내부 DTD Subset

 

▶ 마크업 언어에 대한 DTD가 XML 문서 내부에서 정의됨

  주로 외부 DTD subset의 일부 내용을 XML문서에서 재정의해 사용할 목적으로 이용

 

 

 

 

 

 

 

 

 

 

● 외부 DTD Subset

 

   마크업 언어에 대한 DTD가 별도의 문서(파일)로 정의 됨 (여러 XML문서에서 공통적으로 사용 가능)

    새로운 마크업 언어를 정의 -> 새로운 외부 DTD subset을 작성

DTD 문서(파일)은 확장자로 "dtd"사용

 

 

 

 

 

 

 

 

 

+) XML 문서의 유효성 검사

● XML 문서 작성 시 유효성(validation) 검사 실시

  - XML editor에 내장된 기능 사용

● XML 문서 이용 시 유효성 검사 실시

  - 응용프로그램이 XML 문서를 처리하기 전에 유효성 검사 실시

  - XML parser의 유효성 검사 기능 이용

          ex) MSXML parser , DOM/SAX parser

 

 

 

 

3. DTD 구성요소

• 엘리먼트(element) 선언			• 노테이션(notation) 선언
- 예: <IELEMENT 이름 (#PCDATA)>		- 예: <NOTATION gif SYSTEM "gifviewer. exe">
• 속성(attribute) 선언			• 조건부 색션(conditional section) 선언
- 예: <!ATTLIST 학생 학년 (1|2|3|4)>	- 예: <!I[NCLUDE [<!ELEMENT 전화 (집, 사무실)>]]>
• 개체(entity) 선언			• 주석(comment)
_ 예: <!ENTITY 학교 “동덕여자대학교">	- 예:<! DTD 주석 >

 

ㅁ 엘리먼트 선언

    ˚ 엘리먼트(element) : XML  문서를 구성하는 논리적 단위

    ˚ 선언 형식

<!ELEMENT 엘리먼트명 contents>

            -  엘리먼트명 : XML 엘리먼트의 이름

            - contents: XML 엘리먼트의 구조(데이터 타입) 정의

                     -> contents model 또는 contents category 정의

ㅁ Contents 유형

     - Contents model

          ▷ #PCDATA : 일반적인 문자 데이터(text)만을 포함

          ▷ children : 자식 엘리먼트 (child element)들을 포함

          ▷ mixed : 문자 데이터와 자식 엘리먼트들을 함께 포함

     -  Contents category

           empty : 내용을 갖지 않는 빈 엘리먼트 선언

           any : 임의의 구조(타입)의 데이터를 포함할 수 있음

 

● 문자 데이터(text) 선언

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

 

       +) PCDATA: XML parser가 해석하는 문자 데이터

 

자식 엘리먼트 선언

: 상위(부모) 엘리먼트에 포함되는 하위 엘리먼트 선언

<!ELEMENT 엘리먼트명 (child1,child2,child3,...,childn)>

     ※ 주의 : 괄호 안에 포함된 자식 엘리먼트들도 DTD에서 각각 별도의 엘리먼트 선언을 해야함

 

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

DTD 문서

<book>
	<title> XML Foundation </title>
    <author> 신인철 </author>
</bookr>

XML 문서

    ※ 주의 : <title>과 <author> 엘리먼트의 사용 순서가 바뀌면 안됨

 

ㅇ 자식 엘리먼들의 표현 방법

: 자식 엘리먼트들의 순서나 반복 횟수를 지정하기 위해 여러 가지 선언자 기호 사용

선언자 기호 설명
   ,  선언된 엘리먼트들을 순서대로 자식 엘리먼트로 사용 // 리스트 연산자
   |  선언된 엘리먼트들 중 하나만 선택해서 자식 엘리먼트로 사용 // 선택 연산자
   ( ) 선언된 엘리먼트들을 하나의 그룹으로 선언 
   * 선언된 엘리먼트가 0번 이상 사용될 수 있음 (0~n) // no or unlimited
   + 선언된 엘리먼트가 1번 이상 사용될 수 있음 (1~n) // one or unlimited
   ?  선언된 엘리먼트가 0번 또는 1번 사용될 수 있음 (0~1) // zero or only one
   무기호 특별한 기호가 없으면 선언된 엘리먼트를 반드시 한번만 사용

 

● 혼합형(mixed) 선언 

: 엘리먼트의 content로 문자 데이터와 자식 엘리먼트를 동시에 선언할 때 사용

<!ELEMENT 엘리먼트명 (#PCDATA|child1|child2|...|childn)*>

 

 

   -  주의 사항

       ⊙ 문자데이터(#PCDATA)를 먼저 선언

        혼합 내용의 반복성은 0번 이상(*)으로 정의

             

<!ELEMENT p(#PCDATA|a|ul|b|i|em)* >
------------------------------------
<p>
	Oh~ <em>Hello</em>  <b>world</b>
</p>

 

 

● EMPTY 선언 

 -  Content를 갖지 않는 빈 엘리먼트를 정의하기 위해 사용

        ◎ 빈 엘리먼트의 경우 content가 없으므로 일반적으로 속성을 가짐

- 형식

<!ELEMENT 엘리먼트명 EMPTY>

- 엘리먼트 사용 방법

         <엘리먼트명></엘리먼트명> 또는 <엘리먼트명 />

                    ※ 주의 : 시작태그와 종료 태그 사이에 공백이 있으면 안 됨

- 예

<!ELEMNET 학번 EMPTY>
<!ELEMNET 이름 EMPTY>
--------------------------
<학번></학번>
<이름/>

 

● ANY 선언

-  엘리먼트의 content에 대해 조건을 두지 않을 경우에 사용   

         ◎ 정의되는 엘리먼트는 임의의 구조를 가질 수 있음

                  √ DTD 내에 선언된 모든 엘리먼트들을 자식 엘리먼트로 가질 수 있음

         ◎ ANY content 유형은 XML 문서 처리를 위한 응용프로그램 개발을 어렵게 만들기 때문에 잘 사용되지 않음

- 형식

<!ELEMENT 엘리먼트명 ANY>

 

ㅁ 속성 선언

    ˚ 속성은 엘리먼트에 부가적인 정보를 제공함

    ˚ 엘리먼트와 관련된 속성 이름, 속성 유형, 속성 기본값 등을 정의

<!ATTLIST 엘리먼트명
	속성명1 속성유형 속성기본값
    속성명2 속성유형 속성기본값 ...>

        -  엘리먼트명, 속성명 : XML 문서에서 선언된 엘리먼트 이름을 명시한 후 그 엘리먼트에 적용될 속성이름 지정

                        √ XML 권고안의 XML 이름 작성 규칙을 따름

                         하나의 엘리먼트에 같은 이름의 속성을 여러 개 선언할 수 없음

        -  속성 유형 : 열거형, 문자열 , 토큰 타입

        -  속성기본값 : 속성의 초기 값, #FIXED, #IMPLIED, #REQUIRED

 

<?xml version="1.0" encoding="UTF-8"?>

<!--엘리먼트 선언-->
<!ELEMENT booklist(book*)>
<!ELEMENT book(title, author)>
<!ELEMENT title(#PCDATA)>
<!ELEMENT author(#PCDATA)>

<!--속성 선언-->
<!ATTLIST book kind CDATA #REQUIRED>

▲DTD 문서 c4_1101.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE booklist SYSTEM "c4_1101.dtd">

<booklist>
	<book kind="소설">
    <title>시인과 도둑</title>
    <author>이문열</author>
    </book>
</booklist>

▲XML 문서 c4_1101.xml

 

● 속성 기본값(디폴트 선언)

    - 엘리먼트 작성시 속성을 생략할 수 있는지 , 반드시 기술해야하는지 등을 지정

    - 속성이 생략될 때 속성이 갖는 디폴트 값 지정 가능

            값                                             의미
#REQUIRED 속성을 반드시 기술해야함
#IMPLIED 속성을 생략 가능
#FIXED value 속성의 값을 미리 지정(값 변경 불가)
value 속성이 생략될 때 생략될 때 사용될 default값 지정

 

▽사용 예

형식 <!ATTLIST 엘리먼트명 속성명 속성유형 #REQUIRED>
DTD문서 <!ATTLIST book kind CDATA #REQUIRED>
XML문서 <book>~</book>    (오류)

 

형식 <!ATTLIST 엘리먼트명 속성명 속성유형 #IMPLIED>
DTD문서 <!ATTLIST book kind CDATA #IMPLIED>
XML문서 <book>~</book>    (kind 속성 생략)

 

형식 <!ATTLIST 엘리먼트명 속성명 속성유형 #FIXED "고정값">
DTD문서 <!ATTLIST book kind CDATA  #REQUIRED
                           nation CDATA #FIXED "국내">
XML문서 <book kind="소설"> ~ </book> (nation="국내")
<book kind="소설" nation="국내"> ~ </book>
<book kind="소설" nation="해외"> ~ </book>    (오류)

 

형식 <!ATTLIST 엘리먼트명 속성명 속성유형 "디폴트값">
DTD문서     <!ATTLIST book kind CDATA #REQUIRED
                               nation CDATA "국내">
XML문서 <book kind="소설"> ~ </book> (nation="국내")
<book kind="소설" nation="해외"> ~ </book>

 

● 속성 유형

    ˚ 문자열 타입(CDATA) : 임의의 문자열을 속성 값으로 가짐

    ˚ 열거형 타입 : 열거된 여러 값들 중 하나를 속성 값으로 가짐

    ˚ 토큰 타입 : 다음과 같은 키워드를 사용하여 속성 값 유형을 정의

속성 유형 설명
ID 속성값은 엘리먼트를 구별하기 위한 식별자로 사용되며,
XML 문서 내에서 유일한 값을 가져야함
IDREF/
IDREFS
속성값은 XML 문서 내에서 ID 속성으로 사용된 값만 사용 가능
다음 엘리먼트의 ID 속성값을 참조하기 위해 사용됨
NMTOKEN/
NMTOKENS
속성값은 XML 이름 작성 규칙을 준서하는 문자데이터만 사용 가능
NOTATION 속성값은 DTD에 명시적으로 선언된 notation명만 사용 가능
ENTITY/
ENTITIES
속성값은 DTD에 명시적으로 선언된 entity명만 사용 가능

 

ㅁ 문자열 타입(CDATA)

- 속성 값에 대해 <, >, &, ' , " 등과 같은 특수문자 제외하고 어떤 문자열도 사용 가능

- 특수문자를 사용할 때는 개체 참조 이용

        ≫ &lt; &gt; &amp; &apos; &quot; 등

- 예

 

ㅁ 열거형 타입

- DTD에 열거된 값들 중에서 하나를 선택하여 사용하도록 함

      ˚ 괄호 안에 나열된 값 이외의 값은 사용 불가

- 예

 

ㅁ ID 타입

- XML 문서에서 엘리먼트들을 유일하게 식별해야할 경우 사용

- 예

- ※ 주의 사항

          ▷ 속성기본값은 #IMPLIED 또는 #REQUIRED만 사용가능

           각 엘리먼트에서 ID 타입 속성은 하나만 정의 가능

           문서 내에서 ID타입 속성의 값은 중복될 수 없음

           ID 타입 속성의 값은 반드시 XML 이름 작성 규칙을 따라야 함

                     ∨예 : 반드시 문자(letter)로 시작, 특수기호 사용 제한

 

ㅁ IDREF(S) 타입

- ID 타입으로 선언된 속성이 갖는 값들 중 하나를 가짐

        º  IDREF(S) 타입 속성의 값은 문서 내에 포함된 ID 속성 값들 중에 일치(참조)하는 것이 반드시 있어야함

- 형식

        º   속성기본값은 #IMPLIED 또는 #REQUIRED만 사용 가능

- IDREFS : ID 타입으로 선언된 속성 값들 중 여러 개를 동시에 참조 가능

        º  속성값들은 공백 문자로 구분

- 예

 

● 개체(ENTITY) 선언

ㅁ 개체의 개념

- XML 문서를 구성하는 물리적 저장 단위(storage unit)

- 종류

         ○ 문서 entity : 일반적인 XML 문서                               ○ 외부 일반 parsed entity

         ○ 외부 DTD subset entity : DTD 문서                          ○  외부 일반 unparsed entity

         ○ 빌트인(built-in) entity : XML에 미리 정의된 문서      ○  내부 파라미터(parameter) entity 

         ○ 내부 일반 parsed entity                                             ○ 외부 파라미터(parameter) entity

 

ㅁ 개체의 사용 목적

- XML 문서에서 구성요소의 공유 및 재사용

     

ㅁ 개체 분류

- 물리적 저장 단위에 따른 구분

              구분                          물리적 저장 단위
내부(internal) 같은 DTD 내에 정의
외부(external) 별도의 파일(XML/DTD 문서)로 정의

 

- 참조되는 위치에 따른 구분

             구분                        참조되는 곳
일반(general) XML 문서에서 참조하여 사용
파라미터(parameter) DTD 문서에서 참조하여 사용

 

- XML parser가 해석 가능한지 여부에 따른 구분

              ● 일반 개체만 해당됨

구분 개체 내용
Parsed XML parser가 해석할 수 있는 내용으로 구성
UnParsed XML parser가 해석할 수 없는 비-문자 데이터로 구성

 

ㅁ 빌트인(built-in) entity

- 미리 정의되어 있는 개체

XML 문서에서 참조 방법 치환될 문자 의미
&lt; < less-than
&gt; > greater-than
&amp; & ampersand
&quot; " double-quote
&apos; ' sigle-quote

- 사용 예

XML 문서 <ex1> XML &amp; JAVA </ex1>                    -> XML & JAVA
<ex2>x &lt; y</ex2>                                       -> x <y
<ex3 attr="&lt;xml&gt; />                                -> "<xml>"

 

ㅁ 내부 일반 parsed entity

- DTD 내에서 문자 데이터로 선언되고, 별도의 물리적인 파일 형태 갖지 않음 (내부, parsed)

- XML 문서에서 참조 (일반)

 

ㅁ 외부 일반 parsed entity

- XML 문서에서 자주 사용되는 엘리먼트들을 별도의 물리적인 파일로 저장한 것 (외부, parsed)

- XML 문서에서 참조 (일반)

 

ㅁ 외부 일반 unparsed entity

- 비-문자 데이터로 이루어진 물리적인 저장 단위를 참조 

        ⊙ 음악 파일, 그림 파일, 동영상 파일 등

- 선언 (DTD 문서)

         Notation과 외부 일반 unparsed entity 선언

         엘리먼트에 대해 ENTITY 타입의 속성 선언

- 참조 (XML 문서)

         ENTITY 타입 속성으로 외부 일반 unparsed entity의 이름을 지정(참조)

 

ㅁ 내부 파라미터(parameter) entity

- DTD 내용의 일부를 DTD 문서 내에서 참조하기 위해 선언

- DTD 내에서 선언되고 참조되기 때문에 선언되는 위치는 반드시 참조되기 전에 와야함

 

 

 ㅁ 외부 파라미터(parameter) entity

- DTD 내용의 일부를 DTD 문서와 다른 물리적인 저장 단위로 저장한 것

- 여러 DTD 문서들에서 공통적으로 사용되는 부분을 별도의 파일로 저장하고 , 외부 파라미터 entity를 선언후 각 DTD문서에서 참조하여 이용

 

ㅁ parameter entity 사용 예

 

● Notation 선언

ㅁ Notation 선언과 사용

- 그림, 동영상, 음악 등 이진(binary) 파일의 포맷(format)을 식별

        ˇ MIME type 이용 (예: text/html, image/jpeg, video/mpeg)

- XML parser가 해석할 수 없는 비-문자 데이터의 포맷과,

  데이터를 처리할 응용 프로그램(helper application)을 지정

 

1) NOTATION 타입의 속성 값으로 사용

- Notation명을 속성 값으로 사용

<!ATTLIST 엘리먼트명 속성명
           NOTATION (notation명1|notation명2|...) "기본값선언">

 ※  주의 사항   

       > EMPTY 엘리먼트는 NOTATION 타입의 속성을 가질 수 없음

       > 각 엘리먼트는 NOTATION 타입의 속성을 최대 하나만 가질 수 있음

2. 외부 일반 unparsed entity의 포맷을 지정하기 위해 사용

- 외부 일반 unparsed entity를 정의하기 위해서는 그 entity가 어떤 포맷으로 저장되어 있는지를 선언해야함

<!ENTITY entity명 SYSTEM "entity 파일의 경로" NDATA notaion명>

 

 

● 조건부 Section 선언

ㅁ 조건부 Section 선언과 사용

     - DTD 문서 내부에서 어떤 조건에 따라 DTD의 내용을 포함하거나 포함하지 않도록 하기 위해 사용

     - 조건부 Section 선언 형식

  ㅇ INCLUDE 키워드로 정의한 부분은 유효성 검사 대상

  ㅇ IGNORE 키워드로 정의한 부분은 XML parser가 읽기는

      하지만 유효성 검사에서 제외

 

 

 

- 사용예

 

 

● DTD 사용 예 : Book Markup Language

ㅁ 마크업 언어 개발 절차

     (1) 어떤 목적으로 마크업 언어를 개발할 것인가?

     

 

참고도서
- 신민철, Java 개발자를 위한 XML, 프리렉, 2006.
- 홍성용, XML 원리와 응용, 한빛아카데미, 2014.
- 정인용, 자바스크립트+제이쿼리 입문, 이지스퍼블리싱, 2014.
– Brett McLaughlin/박영록 역, Head Rush Ajax, 한빛미디어, 2006.
- Kirupa Chinnathambi/이태상 역, 리액트 웹앱 제작 총론, 2/e, 2019.
– Alex Banks/오현석 역, 러닝 리액트, 2/e, 한빛미디어, 2021