Programming

[XML] DTD 선언

Lawmin 2010. 10. 18. 15:14

문서 유형 선언

 

1. 외부 DTD 문서 선언

XML문서가 어떤 마크업언어로 작성되었는지 표시하여 문서를 전달받은쪽에서 해석이 가능하도록 하는것을 문서 유형 선언이라고 한다. 기본적으로 다음의 문법을 따른다.

 

<! DOCTYPE 루트엘리먼트명 SYSTEM|PUBLIC "식별자">

  • SYSTEM 키워드를 이용한 선언 : 외부에 파일이 있는 경우
    <! DOCTYPE 루트엘리먼트 SYSTEM "http://웹서버주소/경로/~.dtd">
  • PUBLIC 키워드를 이용한 선언 : 공개적인 사용을 위해 업체및 국제공인 단체에서 작성된 DTD 사용

        <! DOCTYPE 루트엘리먼트 PUBLIC "PUBLIC식별자"
                                               "SYSTEM 식별자">
    • PUBLIC 키워드를 사용하기 위해서는 PUBLIC 식별자를 생성해야 한다.
    • 문법 : +|-//DTD개발 및 보수업체명//DTD명 및 버전번호//사용된언어
    • 예제
      • HTML DTD의 PUBLIC 식별자
        <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
      • XML DTD의 PUBLIC 식별자
        <! DOCTYPE HTML PUBLIC "-//WAPFORUM//DTD WML 1.1//EN">

2. 내부 DTD 서브셋 문서선언

<! DOCTYPE 루트엘리먼트 [

       <!-- DTD 내용 -->

]>

 

엘리먼트 선언

 

1. 엘리먼트 선언 문법

<! DOCTYPE 엘리먼트명 콘텐트유형>

2. 엘리먼트의 종류

  • 시작태그, 콘텐트, 끝 태그로 구성된다.
  • 엘리먼트가 어떤 유형의 콘텐트를 가지느냐에 따라 엘리먼트 선언이 달라진다.
  • 엘리먼트에 올 수 있는 콘텐트의 유형
    • 자식엘리먼트 리스트 : 내용으로 자식 엘리먼트만 갖는 엘리먼트
    • #PCDATA : 내용으로 문자 데이터만 갖는 엘리먼트
    • EMPTY : 아무 내용도 갖지 않는 엘리먼트
    • MIXED : 문자데이터 와 자식엘리먼트를 혼합하여 갖는 엘리먼트
    • ANY : 내용에 모든것을 갖는 엘리먼트

3. 콘텐트별 엘리먼트 선언법

  • 자식 엘리먼트만 갖는 엘리먼트의 선언
    <!ELEMENT 엘리먼트명 (자식엘리먼트1,자식엘리먼트2,...)>
  • 문자 데이터만 갖는 엘리먼트의 선언
    <!ELEMENT 엘리먼트명 (#PCDATA)>
  • 아무 내용도 갖지 않는 엘리먼트의 선언
    <!ELEMENT 엘리먼트명 EMPTY>
  • 문자데이터와 자식엘리먼트를 혼합하여 갖는 엘리먼트의 선언
    <!ELEMENT 엘리먼트명 (#PCDATA|child1|...|childx)*)>

    * 주의사항
    •  #PCDATA가 제일 먼저 선언되어야 한다.
    • () 안에는 | 연산자만 사용할수 있다.
    • () 다음에 * 를 반드시 붙여주어야 한다.
  • ANY 유형을 갖는 엘리먼트의 선언
    <!ELEMENT 엘리먼트명 ANY>

    * 문자데이터, DTD내의 모든 엘리먼트를 자식엘리먼트로 가질수 있는 유형으로 XML문서를 처리하는 프로그램의 개발이 어려워지므로 잘 사용되지는 않는다.

 

속성 선언

 

속성은 엘리먼트에 부가적인 정보를 제공해주며, 속성으로 만들수 있는것은 자식엘리먼트로 만들수도 있기 때문에 그것을 정의하는것은 개발자의 몫이다. 속성을 사용하게 되면 여러가지 제한을 부여할수 있다.

 

1. 속성 선언 문법

<!ATTLIST 속성명

         속성명1 속성유형 디폴트선언

         속성명2 속성유형 디폴트선언

  . . . . >

>

2. 디폴트 선언의 종류

  • #IMPLIED : 엘리먼트 작성시 생략 가능한 속성
  • #REQUIED : 엘리먼트 작성시 속성을 반드시 기술
  • #FIXED : 지정된 문자열 이외에는 넣을수 없다
  • 디폴트값 : 속성이 생략되는 경우 기본으로 사용될 속성을 지정

예>   <!ATTLIST book

                 kind CDATA #FIXED "신간"

                 title CDATA #REQUIRED

                 nation CDATA "국내">

 

 

3. 속성 유형의 종류에 따른 속성 선언법

  • CDATA : 문자데이터
  • ENUMERATION : DTD상에 정의된 값 중 하나가 와야 한다.
         <!ATTLIST 엘리먼트
                 속성명 (속성값|속성값|속성값|...) 디폴트 선언>
  • ID : 엘리먼트의 인스턴스를 구별하기위한 식별자로 사용되며 유일한 값이어야 한다.
         <!ATTLIST 엘리먼트
                 속성명 ID 디폴트선언>
  • IDREF/IDREFS : ID속성값으로 지정된 값만 사용할 수 없다.
         <!ATTLIST 엘리먼트
                 속성명 IDREF 디폴트선언>
  • NMTOKEN/NMTOKENS : 이름 작성규칙을 지킨 데이터만 사용
         <!ATTLIST 엘리먼트
                 속성명 NMTOKEN 디폴트선언>
  • NOTATION : DTD에 명시적으로 선언된 NOTATION명만 사용가능
         <!ATTLIST 엘리먼트
                 속성명 NOTATION(노테이션명|노테이션명|노테이션명|...) 디폴트선언>
  • ENTITY : DTD에 명시적으로 선언된 엔티티명만 가능
         <!ATTLIST 엘리먼트
                 속성명 ENTITY 디폴트선언>

 

엔티티 선언

 

엔티티란 XML문서를 저장하는 물리적인 저장단위를 말한다. 엔티티를 사용하면 각각의 문서를 재사용하기 쉬워지기 때문에 많이 사용한다. XML권고안에는 도큐먼트 엔티티를 포함하여 다음과 같은 엔티티를 정의하고 있다.

  • 도큐먼트 엔티티
    XML문서의 물리적인 저장단위로 기본이 되는 엔티티는 도큐먼트 엔티티이며, 모든 문서는 한개의 도큐먼트 엔티티를 가져야 한다.
  • 외부 DTD 서브셋 엔티티
    외부 DTD 서브셋 문서를 말한다.
  • 빌트인 엔티티
    미리 정의된 엔티티를 말하며 별도의 선언없이 사용가능하다.
    &lt (<), &gt(>), &amp(&), &quot("), &apos(')
  • 내부 일반 파스드 엔티티
    • DTD문서에서 특정 데이터 값으로 인식되며 물리적 단위인 파일형태는 가지지 않는다.
    • 선언 :  <!ENTITY 엔티티명 "대치할 문자데이터">
    • 사용 : &엔티티명;

      예>   정의 : <!ENTITY kr "대한민국">
             사용 : <nation>&kr;</nation>         &kr; -> "대한민국" 으로 치환된다.
  • 외부 일반 파스드 엔티티
    • 자주 사용하는 엘리먼트들을 도큐먼트 엔티티와 다른 물리적 저장단위로 저장한것이다.
    • 정의 방법은 아래와 같으며 사용법은 내부일반 파스드엔티티와 동일하다.
    • 선언 : <!ENTITY 엔티티명 SYSTEM "파일위치">
    • 사용 : &엔티티명;
  • 외부 일반 언파스드 엔티티
    • 문자데이터가 아닌 그림, 음악, 동영상등을 말하며 반드시 노테이션 선언 후 사용해야 한다.
    • 선언 : <!ENTITY 엔티티명 SYSTEM "파일위치"
                                      NDATA 노테이션명>
      예>     <!-- 노테이션 선언-->
               <!NOTATION gif PUBLIC "image/gif" "photoshop.exe">

               <!-- 외부 일반 언파스드 엔티티-->
               <!ENTITY front_image SYSTEM "front.gif" NDATA gif>
  • 내부 파라미터 엔티티
    • DTD내용의 일부를 DTD내부에서 선언한것을 말한다. 별도의  파일로 존재하지는 않는다.
    • 선언 : <!ENTITY % 엔티티명 "대치할 DTD문">
    • 사용 : %엔티티명;
              파라미터 엔티티의 경우 & 대신 %를 사용하므로 유의한다.
  • 외부 파라미터 엔티티
    • DTD내용의 일부를 외부 DTD문서셋에 저장하는것을 말한다.
    • 선언 : <!ENTITY 엔티티명 SYSTEM "파일위치">
    • 사용 : %엔티티명;

 

엔티티는 다음과 같이 분류된다.

  • 물리적 저장단위에 따른 구분
    • 내부 : DTD내에서 특정 내용으로 선언되는 경우
    • 외부 : 외부 파일 형태로 존재하는 경우
  • 사용되는곳에 따른 구분
    • 일반 : XML문서에서 참조하여 사용하는 경우
    • 파라미터 : DTD 내에서 참조하여 사용하는 경우
  • 데이터 타입에 따른 구분
    • 파스드 : XML 파서가 해석할수 있는 문자데이터로 구성된 경우
    • 언파스드 : XML 파서가 해석할수 없는 그림, 음악, 동영상 파일 등으로 구성된 경우