상세 컨텐츠

본문 제목

DTD문서 작성법 1 (엘리먼트가 가지는 데이터 유형 정의)

Web Development/Others

by thankee 2008. 9. 10. 22:57

본문

A사와 B사에서 정보전달을 위한 목적으로 XML을 사용하기로 했다. 하지만 어떻게 A사와 B사 모두 같은 문법을 사용한 XML문서를 작성하도록 할 수 있을까? 그것은 문법과 유형을 정의하고있는 DTD 문서를 작성하여, 두 회사에서 해당 DTD문서를 사용해 XML문서를 작성하게 하면 된다. 특정 DTD문서에서 정의한 문법에 어긋난 XML문서는 XML Parser가 해석할 때 에러를 출력하도록 할 수 있다..

텍스트 선언

xml문서와 마찬가지로 DTD문서의 최상단에는 텍스트 선언이라고 해서 다음과 같은 문장이 위치해야한다.(생략할 수 있다.)

<?xml version="버전" encoding="인코딩방식"?>
<?xml version="1.0" encoding="euc-kr"?>

생략시 Default 값은 '1.0', 'utf-8' 이다.

주석

<!-- -->로서 xml과 동일하다.

엘리먼트

xml 문서에서 사용할 엘리먼트를 선언하기 위해서는 <!ELEMENT>를 사용한다. xml은 대소문자를 구분하기 때문에, 'ELEMENT'는 반드시 대문자로 기술하여아한다.

<!ELEMENT 엘리먼트명 유형>

엘리먼트명의 작성 규칙은 다음과 같다.

  • 'xml', 숫자, 특수문자('_'문자는 제외)로 시작할 수 없다.
  • 두번째 문자 부터 '_', '.', '-' 문자와 숫자를 사용할 수 있다.(':' 문자도 사용할 수 있지만, 네임스페이스 선언과 중복되므로 사용을 권장하지 않는다.)
  • 공백이 포함될 수 없다.

유형에 사용될 수 있는 것들은 다음과 같다.

  • #PCDATA : 문자 데이터만을 가짐.
    '<!ELEMENT person (#PCDATA)>'는 xml문서에서 다음을 허용한다.
    <!-- CDATA섹션을 데이터로 가지는 엘리먼트-->
    <person><![CDATA[hellow]]></person>
      
  • EMPTY : 데이터를 가지지 않음.
    <!ELEMENT person EMPTY>
    이 유형을 가진 엘리먼트는 xml문서에서 다음과 같은 사용만 허용한다.
    <person></person> 또는 <person />
      
  • ANY : 모든 엘리먼트와 문자데이터를 가질 수 있음.
    '<!ELEMENT person ANY>'는 모든 엘리먼트와 데이터의 사용을 허용하게 된다.
      
  • 자식 엘리먼트 : 지정한 자식엘리먼트만 가질 수 있음.
    기술한 자식엘리먼트를 가질 수 있게 한다. 자식엘리먼트 리스트의 기술에는 패턴규칙이 적용될 수 있다. 즉, '?', '*'. '+'. '|', ','  등의 패턴과 결합해 다양한 표현을 할 수 가 있다.
    1. 반드시 기술한 순서대로 자식엘리먼트가 작성되도록 하는 ',' 연산자
        -DTD문서 내용
        <!ELEMENT person (name, gender)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT gender (#PCDATA)>
        -XML문서내용
        <person>
             <name>이하늬</name>
             <gender>Female</gender>
        </person>
    2. 자식 엘리먼트의 반복 숫자를 제어할 수 있도록 해주는 '?', '*', '+' 연산자
      - ? : Zero or One
      - * : Zero or More
      - + : One or More
      의 의미를 가지고 있다. 따라서 다음과 같이 다양하게 표현할 수 있다.
        -DTD문서 내용
        <!ELEMENT person (name, age?, nickname+, (schoolname, graduated)*)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            <!ELEMENT nickname (#PCDATA)>
            <!ELEMENT schoolname (#PCDATA)>
            <!ELEMENT graduated (#PCDATA)>
        -XML문서내용
        <person>
            <name>이시향</name>
            <age>16</age>
            <nickname>너구리</nickname>
            <nickname>이썅</nickname>
        </person>
    3. 리스트 중 하나만 선택해서 작성할 수 있도록 해주는 '|' 연산자
        -DTD문서 내용
        <!ELEMENT person (name, (brother|sister)*)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT brother (#PCDATA)>
            <!ELEMENT sister (#PCDATA)>
        -XML문서내용
       
    <person>
            <name>정순영</name>
            <sister>정순화</sister>
            <brother>정순철</brother>
            <sister>정순지</sister>
        </person>
        
  • 혼합형태 : 아무 데이터나 자식을 가지지 않거나, 지정한 자식엘리먼트, 문자데이터 등 모두 가질 수 있는 형태
    <!ELEMENT person (#PCDATA | child1 | child2 | childN)*>
    위와 같이 사용할 수 있지만 다음과 같은 주의사항이 있다.
      - 문자데이터를 포함할 수 있도록 하기위해 #PCDATA는 반드시 젤 첫번째 위치에 존재해야한다.
      - 괄호 마지막에 '*'은 반드시 존재해야한다.
      - 리스트 사이에는 반드시 '|'연산자를 사용해야한다.
주의사항 : ANY나 EMPTY가 아닌 #PCDATA나 자식엘리먼트를 기술 할 때는 반드시 괄호'(', ')'에 포함되어야 한다.

관련글 더보기