Mark Up/XML XML/DTD
  • 728x90
    반응형

    DTD





    스키마(schema)



    XML은 다른 마크업 언어를 만드는데 사용되는 다목적 마크업 언어이다.

    이렇게 다른 언어를 정의하기 위해서는 먼저 해당 언어에 필요한 요소와 속성을 파악해야만 한다.

    이러한 정보들의 집합을 스키마(schema)라고 부른다.

    스키마는 일관성 있는 XML 문서를 유지하는데 아주 중요한 역할을 한다.


    XML에서 스키마를 작성할 때에는 다음과 같이 두 가지 방법을 사용할 수 있다.


    1. DTD(Document Type Definition)
    2. XML 스키마(XSD)

    문서 타입 정의(DTD)란?



    문서 타입 정의(DTD)는 XML 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의한다.


    DTD는 엔티티를 정의할 수 있으며, 빠른 개발을 위한 내부 DTD를 사용할 수 있다.

    DTD는 예전부터 사용해 온 구식 방법이지만, 특유의 장점을 바탕으로 아직도 널리 사용되고 있다.

    이러한 DTD는 XML 문서 내부에 명시할 수도 있으며, 별도의 파일로 분리할 수도 있다.



    DTD의 사용 목적



    DTD를 사용하여 새로운 XML 문서의 구조를 정의함으로써 새로운 문서 타입을 만들 수 있다.

    이렇게 생성된 DTD는 새로운 문서 타입을 이용한 데이터의 교환에서 표준으로써 활용된다.

    또한, 응용 프로그램은 DTD의 정의에 따라 XML 문서의 구문 및 구조에 대한 유효성을 검사할 수 있다.



    DTD 문법



    XML에서 DTD를 작성하는 문법은 다음과 같다.


    문법

    <!DOCTYPE 루트요소 DTD식별자 [선언1 선언2 ...]>


    DTD는 <!DOCTYPE 으로 시작한다.

    루트(root) 요소는 XML 파서(parser)에 명시된 루트 요소부터 파싱(parsing)을 시작하라고 알려주는 역할을 한다.


    DTD 식별자는 프로그램 외부에 존재하는 DTD 파일을 위한 식별자이다.

    만약에 DTD 식별자가 외부 주소를 가리키고 있으면, 그것을 외부 서브셋(subset)이라고 한다.

    괄호([]) 안에는 내부 서브셋(subset)이라 불리는 추가로 선언한 엔티티(entity)의 리스트가 존재한다.



    DTD 내부 서브셋(subset)



    DTD가 XML 파일 내부에서 선언되면, 그 선언은 반드시 <!DOCTYPE>안에 위치해야 한다.


    예제

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

    <!DOCTYPE food [

    <!ELEMENT food (name, type, cost)>

    <!ELEMENT name (#PCDATA)>

    <!ELEMENT type (#PCDATA)>

    <!ELEMENT cost (#PCDATA)>

    ]>

    <food>

    <name>상추</name>

    <type>야채</type>

    <cost>2000</cost>

    </food>


    위의 예제에서 !DOCTYPE food 는 이 문서의 루트(root) 요소가 <food>요소라는 사실을 명시한다.

    !ELEMENT food는 <food>요소가 <name>, <type>, <cost>의 세 요소를 반드시 포함해야 한다는 사실을 명시한다.

    !ELEMENT name은 <name>요소가 #PCDATA 타입의 요소라는 사실을 명시한다.

    !ELEMENT type은 <type>요소가 #PCDATA 타입의 요소하는 사실을 명시한다.

    !ELEMENT cost은 <cost>요소가 #PCDATA 타입의 요소라는 사실을 명시한다.



    DTD 외부 서브셋(subset)



    DTD가 XML 파일 외부에서 선언되면, <!DOCTYPE>은 반드시 외부 DTD 파일의 주소 정보를 포함해야 한다.

    이러한 외부 DTD 파일은 .dtd 확장자를 사용하여 저장한다.


    data.xml

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

    <!DOCTYPE food SYSTEM "food.dtd">

    <food>

    <name>상추</name>

    <type>야채</type>

    <cost>2000</cost>

    </food>


    food.dtd

    <!ELEMENT food (name, type, cost)>

    <!ELEMENT name (#PCDATA)>
    <!ELEMENT type (#PCDATA)>

    <!ELEMENT cost (#PCDATA)>



    XML 문서의 구성 요소



    DTD에서는 모든 XML 문서가 다음과 같은 구성 요소로 이루어져 있다고 본다.


    1. 요소(elements)
    2. 속성(attributes)
    3. 엔티티(entities)
    4. PCDATA
    5. CDATA

    요소(elements)



    DTD에서 요소(element)란 XML 문서를 구성하는 가장 중요한 구성 요소이다.

    DTD에서 요소는 다음과 같이 ELEMENT 구문으로 선언할 수 있다.


    문법

    <!ELEMENT 요소이름 요소카테고리>

    또는

    <!ELEMENT 요소이름 (요소내용)>



    속성(attributes)



    DTD에서 속성은 요소에 대한 추가적인 정보를 제공하며, 해당 요소의 특징을 정의한다.


    DTD에서 속성은 다음과 같이 ATTLIST 구문으로 선언할 수 있다.


    문법

    <!ATTLIST 요소이름 속성이름 속성타입 속성값>



    엔티티(entities)



    XML 에서는 예약되어 있는 다섯 개의 특별한 기호가 있다.

    이렇게 예약되어 있는 기호를 XML 문서에서 사용하면 XML 파서는 그것을 전혀 다른 의미로 해석한다.

    따라서 이렇게 예약된 기호를 기존에 사용하던 의미 그대로 사용하기 위해서 만든 문자셋을 엔티티(entity)라고 한다.


    DTD에서 내부 엔티티는 다음과 같이 ENTITY 구문으로 선언할 수 있다.


    문법

    <!ENTITY 엔티티이름 :엔티티값">


    또한, 문서 외부에 존재하는 외부 엔티티는 다음과 같이 SYSTEM 키워드를 사용하여 선언할 수 있다.


    문법

    <!ENTITY 엔티티이름 SYSTEM "URI또는 URL">



    PCDATA



    PCDATA(Parsed Character DATA)란 XML 파서에 의해 분석될 문자 데이터를 의미한다.

    간단히 말해 XML 요소의 시작 태그와 종료 태그 사이에 위치한 텍스트를 PCDATA라고 생각하면 된다.


    PCDATA는 XML 파서가 엔티티(entity)와 마크업(markup)으로 나누어 분석한다.

    이렇게 XML 파서에 의해 분석될 문자 데이터만을 가지는 요소는 요소의 내용을 #PCDATA로 명시하여 선언한다.


    문법

    <!ELEMENT 요소이름 (#PCDATA)>



    CDATA



    CDATA(Character DATA)란 XML 파서가 분석하지 않는 문자 데이터를 의미한다.

    DTD에서 요소의 콘텐츠에는 PCDATA만이 올수 있으며, 속성의 속성값으로는 CDATA만이 올 수 있다.


    문법

    <!ATTLIST 요소이름 속성이름 CDATA 속성값>



    DTD 요소 선언



    DTD에서 요소는 다음과 같이 ELEMENT 구문으로 선언할 수 있다.


    문법

    <!ELEMENT 요소이름 요소카테고리>

    또는

    <!ELEMENT 요소이름 (요소내용)>



    빈 요소의 선언



    콘텐츠를 가지지 않는 빈 요소(empty element)는 요소 카테고리를 EMPTY로 설정하여 선언한다.


    문법

    <!ELEMENT 요소이름 EMPTY>


    DTD 예제

    <!ELEMENT line EMPTY>


    위의 예제에서 <line>요소는 어떠한 콘텐츠도 가지지 않는 빈 요소가 된다.



    하나의 자식 요소만을 가지는 요소의 선언



    DTD에서 요소를 선언할 때에는 자식 요소를 명시할 수 있다.

    하나의 자식 요소만을 가지는 요소는 자식 요소의 이름을 괄호 안에 명시하여 선언한다.


    문법

    <!ELEMENT 요소이름 (자식요소이름)>


    DTD 예제

    <!ELEMENT parent (child)>


    위의 예제에서 <parent>요소는 단 하나의 <child>요소만을 자식 요소로 가진다.



    여러 자식 요소를 가지는 요소의 선언



    DTD에서 요소를 선언할 때에는 둘 이상의 자식 요소를 명시할 수 있다.

    자식 요소를 여러 개 가지는 요소는 자식 요소의 이름을 모두 괄호(( )) 안에 명시하여 선언한다.


    문법

    <!ELEMENT 요소이름 (자식요소이름1, 자식요소이름2, ...)>


    DTD 예제

    <!ELEMENT body (head, body, arm, leg)>


    위의 예제에서 <body>요소는 자식 요소로 <head>, <body>, <arm>, <leg>요소를 가진다.



    최소한 하나 이상의 자식 요소를 가지는 요소의 선언



    DTD에서 요소를 선언할 때에는 자식 요소가 최소한 하나 이상임을 명시할 수 있다.

    이러한 요소는 자식 요소의 이름 바로 뒤에 플러스(+) 기호를 사용하여 선언한다.


    문법

    <!ELEMENT 요소이름 (자식요소이름+)>


    DTD 예제

    <!ELEMENT parent (children+)>


    위의 예제에서 <parent>요소는 하나 이상의 <children> 요소를 자식 요소로 가질 수 있다.



    자식 요소를 가질 수도 있고, 가지지 않을 수도 있는 요소의 선언



    DTD에서 요소를 선언할 때에는 자식 요소를 가질 수도, 가지지 않을 수도 있게 명시할 수 있다.

    이러한 요소는 자식 요소의 이름 바로 뒤에 별(*) 기호를 사용하여 선언한다.


    문법

    <!ELEMENT 요소이름 (자식요소이름*)>


    DTD 예제

    <!ELEMENT parent (children*)>


    위의 예제에서 <parent>요소는 <children>요소를 자식 요소로 가질 수도 있고, 가지지 않을 수도 있다.



    자식 요소를 가지지 않거나, 단 하나의 자식 요소만을 가지는 요소의 선언



    DTD에서 요소를 선언할 때에는 자식 요소를 가지지 않거나, 단 하나의 자식 요소만을 가지도록 명시할 수 있다.

    이러한 요소는 자식 요소의 이름 바로 뒤에 물음표(?) 기호를 사용하여 선언한다.


    문법

    <!ELEMENT 요소이름 (자식요소이름*)>


    DTD 예제

    <!ELEMENT parent (children*)>


    위의 예제에서 <parent>요소는 <children>요소를 가지지 않거나, 만약 가진다면 단 하나만 가질 수 있다.



    자식 요소를 선택적으로 가지는 요소의 선언



    DTD에서 요소를 선언할 때에는 자식 요소를 선택적으로 가지도록 명시할 수 있다.

    이러한 요소는 선택적으로 가질 자식 요소의 이름을 모두 괄호(( )) 안에 명시하고, | 기호를 이용해 구분하여 선언한다.


    문법

    <!ELEMENT 요소이름 (자식요소이름1, ..., (자식요소이름2 | 자식요소이름3 |...))>


    DTD 예제

    <!ELEMENT parent (brother, (boy|girl))>


    위의 예제에서 <parent>요소는 자식 요소로<brother>요소는 단 하나만 가진다.

    하지만 <boy>요소와 <girl>요소는 둘 중 하나만을 자식 요소로 가질 수 있다.



    DTD 속성 선언



    DTD에서 속성은 요소에 대한 추가적인 정보를 제공하며, 해당 요소의 특징을 정의한다.


    DTD에서 속성은 다음과 같이 ATTLIST 구문으로 선언할 수 있다.


    문법

    <!ATTLIST 요소이름 속성이름 속성타입 속성값>


    요소의 이름은 해당 속성이 포함될 요소의 이름을 명시한다.



    속성의 타입 정의



    DTD에서 속성을 선언할 때 사용할 수 있는 속성 타입은 다음과 같다.


    속성 타입

    설명

    CDATA

    이 타입의 속성값은 문자 데이터(character data)임.

    (속성값1|속성값2|...)

    이 타입의 속성값은 나열된 리스트 중 하나에 해당함.

    ID

    이 타입의 속성값은 하나뿐인 아이디(id)임.

    IDREF

    이 타입의 속성값은 다른 요소의 아이디(id)임.

    IDREFS

    이 타입의 속성값은 다른 아이디(id)의 리스트임.

    NMTOKEN

    이 타입의 속성값은 유효한(valid) XML 이름임.

    NMTOKENS

    이 타입의 속성값은 유효한(valid) XML 이름의 리스트임.

    ENTITY

    이 타입의 속성값은  엔티티(entity)임.

    ENTITIES

    이 타입의 속성값은 엔티티(entity)의 리스트임.

    NOTATION

    이 타입의 속성값은 notation의 이름임.

    xml:

    이 타입의 속성값은 미리 정의된 예약어인 'xml'임.



    속성값 정의



    DTD에서 속성을 선언할 때 사용할 수 있는 속성값은 다음과 같다.


    속성값

    설명


    이 속성의 속성값이 명시되지 않을 경우 사용할 기본값임.

    #REQUIRED

    이 속성은 반드시 명시되어야 함.

    #IMPLIED

    이 속성은 명시되어도 되고, 명시되지 않아도 됨.

    #FIXED 값

    이 속성의 속성값은 명시된 값으로 고정됨.


    DTD 예제

    <!ELEMENT math EMPTY>

    <!ATTLIST math grade CDATA 'F'>


    위의 예제에서 만약 grade 속성의 속성값을 명시하지 않으면, 기본값으로 'F'가 자동 설정된다.



    DTD 엔티티(entity)



    DTD에서 엔티티(entity)는 특정 문자열을 손쉽게 사용할 수 있도록 상용구와 같은 역할을 한다.

    엔티티의 이름과 확장할 문자열을 미리 정의해 놓으면, XML 문서나 DTD에서 사용되는 엔티티의 이름은 모두 미리 정의한 문자열로 대체된다.



    엔티티의 종류



    DTD에서 엔티티는 일반 엔티티와 파라미터 엔티티로 구분된다.

    이 두 엔티티의 차이점은 바로 엔티티가 확장되는 곳이 어디인가 하는 점이다.


    일반 엔티티는 XML 문서에서만 확장될 수 있으며, 파싱되거나 파싱되지 않을 수도 있다.

    파라미터 엔티티는 DTD 내부에서만 확장될 수 있으며, 반드시 파싱된다.



    XML 엔티티



    XML에서 미리 예약된 엔티티는 다음과 같다.


    1. &lt;
    2. &gt;
    3. &amp;
    4. &quot;
    5. &apos;
    위와 같은 다섯 개의 엔티티를 제외한 모든 엔티티는 반드시 사용하기 전에 DTD에서 선언해야 한다.


    내부 엔티티 선언



    DTD에서 엔티티는 XML 문서나 DTD내부에 선언할 수도 있으며, 파일 외부에 선언할 수도 있다.


    XML 문서나 DTD 내부에 선언되는 내부 엔티티는 다음과 같은 문법으로 선언할 수 있다.


    문법

    <!ENTITY 엔티티이름 "엔티티값">


    이렇게 선언된 내부 엔티티는 XML 문서에서 AND기호(&) + 엔티티 이름 + 세미클론(;)의 형식으로 사용한다.


    DTD 예제

    <!ENTITY css "Cascading Style Sheets">


    XML 예제

    <lecture>&css;</lecture>    // <lecture>Cascading Style Sheets<lecture>



    외부 엔티티 선언



    외부에 파일 형태로 선언되는 외부 엔티티는 다른 DTD 문서에서 재사용할 수 있다.


    문서 외부에 존재하는 외부 엔티티는 다음과 같이 SYSTEM 키워드를 사용하여 선언할 수 있다.


    문법

    <!ENTITY 엔티티이름 SYSTEM "URI또는 URL">


    이렇게 선언된 외부 엔티티는 XML 문서에서 AND기호(&) + 엔티티 이름 + 세미클론(;)의 형식으로 사용한다.


    DTD 예제

    <!ENTITY html SYSTEM "http://codingsam.com/xml/html.dtd">


    XML 예제

    <lecture>&html;</lecture>    // <lecture>HyperText Markup Language<lecture>



    파라미터 엔티티의 선언



    DTD 문서에서만 사용하기 위해 선언한 엔티티를 파라미터 엔티티라고 한다.


    DTD 내부에 선언되는 파라미터 엔티티는 다음과 같은 문법으로 선언할 수 있다.


    문법

    <!ENTITY %엔티티이름 "엔티티값">


    파라미터 엔티티는 엔티티 이름 앞에 퍼센트(%) 기호가 들어가는 것을 제외하면, 일반 엔티티와 같은 방법으로 사용된다.




    728x90
    반응형

    'Mark Up > XML' 카테고리의 다른 글

    XSD 단순 타입  (0) 2018.11.12
    XML/XSD  (0) 2018.11.12
    XML/XPath  (0) 2018.11.09
    XML 노드  (0) 2018.11.05
    XML DOM  (0) 2018.11.05
상단으로