상세 컨텐츠

본문 제목

DTD문서 작성법3 (Entity, 컨티셔널 섹션)

Web Development/Others

by thankee 2008. 9. 12. 16:17

본문

Entity

Entity는 보통 엔티티가 사용되는 위치나 엔티티내용이 외부파일로 존재하는가에 등에 의해 여러가지로 분류되어진다.

  • 내부 엔티티 : 내부 엔티티란 DTD문서 내에서 텍스트형태로 정의된 엔티티를 말한다. 내부 엔티티는 내부 일반 엔티티와 내부 파라미터 엔티티로 구분되는데, 그 차이는 엔티티의 사용영역에 따른다.
    - 내부 일반 엔티티 : 내부 일반 엔티티는 일반적으로 xml문서에서 사용되는 엔티티를 말하며, '&'로 시작하고 ';'으로 종료되는, 예를 들어 &엔티티명;과 같은 형태를 띤다. 엔티티의 정의는 DTD문서내에서 정의되며, 사용은 xml문서에서 사용하게 된다.
        DTD문서
        <!ENTITY 엔티티명 "엔티티내용">
        XML문서
        <!-- 아래와 같은 선언은 DTD문서의 엔티티내용으로 대체된다. -->
        &엔티티명;
    - 내부 파라미터 엔티티 : 내부 일반 엔티티와 차이점은 내부 파라미터 엔티티는 DTD문서 내에서 사용된다는 점이다. 중복되는 문장을 내부 파라미터 엔티티를 이용하여 보다 간편하고 간결하게 표현될 수 있다.
        DTD문서
        <!--엔티티선언-->
        <!ENTITY % 엔티티명 "엔티티내용">
        <!-- 엔티티사용-->
        %엔티티명;
  • 외부 엔티티 : 외부 엔티티란 엔티티의 내용 부분만 외부의 파일 형태로 저장된 것을 말한다.(파일 확장자 상관없음) 내부 엔티티와 마찬가지로 일반과 파라미터로 분류된다. 한가지를 제외하고 내부 엔티티와 모두 같다. 그 차이점은 엔티티를 선언할 때 다음과 같이 선언한다는 점이다.
        <!ENTITY 엔티티명 SYSTEM "엔티티경로">
        <!ENTITY % 엔티티명 SYSTEM "엔티티경로">
    즉 엔티티내용 부분을 엔티티 내용이 저장된 파일의 경로로 대체하면 된다.
  • 내장(Built-in) 엔티티 : 내장 엔티티란 XML에서 미리 정의되어 제공하는 엔티티들을 말한다. 이 엔티티들은 미리 예약되어 있으며, 사용자는 내장 엔티티를 사용만하면 된다. 대표적으로 자주 사용되는 내장 엔티티는 다음과 같다.

    엔티티

    대체될 문자

    &amp; 또는 &#x0026; &
    &lt; 또는 &#x003C; <
    &gt; 또는 &$x003E; >
    &apos; 또는 &#0027; '
    &quot; 또는 &#0022; "
    &#x20; 공백
    &#xd; 캐리지 리턴
    &#xa; 라인피드
    &#x9;
    &#92; \
  • 외부 일반 언파스드 엔티티 : Unparsed, 말그대로 XML파서나 응용프로그램이 해석할 수 없는 비문자 데이터에 대한 엔티티를 지정할 수 있다. 이 엔티티를 이용하기 위해서는 해당 비문자 데이터 타입에 대한 Notation이 먼저 정의되어있어야한다. Entitiy 정의할 때, 해당 비문자 데이터의 경로를 지정하고, 그 타입을 Notation으로 지정하면 된다.
        DTD파일
        <!-- 사용될 비문자 데이터의 타입을 Notation으로 지정-->
        <!NOTATION jpg SYSTEM "painter.exe">
        <!-- ENTITY에서 해당 비문자 데이터 지정 및, 해당 파일의 형식을 Notation으로 지정-->
        <!ENTITY myPicture SYSTEM "myface.jpg" NDATA jpg>
        <!-- 엔티티를 사용할 엘리먼트의 속성 정의-->
        <!ELEMENT person EMPTY>
        <!ATTLIST person image ENTITY #IMPLIED>
        XML파일
        <!-- 지정한 엔티티의 사용-->
        <person image="myPicture" />

컨디셔널 섹션(Conditional Section)

DTD문서 내에서, 어떤 특정 영역을 DTD문서의 내용으로 포함할 것인지 무시하도록 할 것인지를 결정할 수 있는 방법이 Conditional Section이라고 한다. 기본적으로 컨디셔널 섹션에서 사용되는 문법은 다음과 같다.

<![(INCLUDE | IGNORE) [
    <!--이 곳에 컨디셔널 섹션이 적용될 DTD를 작성하면된다.-->
]>

컨디셔널 섹션의 영역이 동작하지 말지를 결정하는 것은, 결정자가 IGNORE인지, INCLUDE인지에 따른다. 말 그대로, INCLUDE는 포함, IGNORE는 무시하겠다는 의미가 된다. 위에서 (INCLUDE | IGNORE) 위치에 INCLUDE 혹은 IGNORE를 위치시켜야한다. 보통 보다 유연하게 사용하기 위해, IGNORE와 INCLUDE를 엔티티로 정의해두고, XML문서에서 내부 DTD 서브셋을 이용, 컨디셔널 섹션을 조작하게된다. 아래에 DTD와 XML문서 내용 예제가 있다.

DTD문서 - test.dtd

<?xml version="1.0" encoding="utf-8"?>
<!ENTITY % section1 "IGNORE">

<!ELEMENT member (student*)>
    <!ELEMENT student (name, tel)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT tel (#PCDATA)>

<!--컨디셔널 섹션 시작-->
<![%section1;[
    <!ATTLIST student gender (male| female) #REQUIRED>
]]>

XML문서 - test.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test SYSTEM "test.dtd" [
    <!-- 컨디셔널 섹션을 포함하도록 한다. DTD내의 엔티티와 내부 DTD서브셋의
          엔티티가 중복될 경우 내부 DTD서브셋이 우선 적용된다.-->

    <!ENTITY % section1 "INCLUDE">
]>

<member>
    <student gender="male">
        <name>양현주</name>
        <tel>010-1111-1111</tel>
    </student>
</member>

관련글 더보기