반응형

◆ ENTITY
선언해 놓은 엔티티의 이름을 속성 값으로 지정할 수 있게 해줍니다.
예를 들면 외부 이미지 파일을 참조하는 SNAPSHOT1이라는 이름의 엔티티를 선언해 놓고 IMAGE라는 이름의 속성을 만들어서 SNAPSHOT1이라는 인티티 이름을 지정할 수 있습니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [                           
<!ELEMENT DOCUMENT (CUSTOMER)*>                
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>                     
<!ATTLIST CUSTOMER
    IMAGE ENTITY #IMPLIED>
<!ENTITY SNAPSHOT1 SYSTEM "image.gif">
]>
<DOCUMENT>
    <CUSTOMER IMAGE="SNAPSHOT1">
.
.
.
    </CUSTOMER>
</DOCUMENT>

◆ ENTITIES
ENTITIES는 공백으로 구분된 엔티티 이름의 목록을 가질 수 있습니다.
같은 속성에 여러 개의 엔티티를 할당하기 위해서 사용합니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>
<!ELEMENT PRODUCT (#PCDATA)>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST CUSTOMER
IMAGES ENTITY #IMPLIED>
<!ENTITY SNAPSHOT1 SYSTEM "image.gif">
<!ENTITY SNAPSHOT2 SYSTEM "image1.gif">
]>
<DOCUMENT>
<CUSTOMER IMAGES="SNAPSHOT1 SNAPSHOT2">
.
.
.
</CUSTOMER>
</DOCUMENT>
반응형
반응형

◆ ID
XML에서는 내부 응용 프로그램에서 구성요소들을 구분하기 위해 ID를 사용합니다.
ID 값은 특별한 의미를 가지므로 XML 처리기는 문서에서 ID형식의 속성값이 같은 두 개의 구성요소가 존재할 수 없다는 것을 알고 있습니다.
속성의 형식을 ID 형식으로 지정하기만 하면 속성의 이름에 관계 없이 ID속성이 됩니다.
그리고 #FIXED 속성은 같은 값을 갖기 때문에 ID 형식에서는 #FIXED를 사용할 수 없고 #REQUIRED를 사용합니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [                           
<!ELEMENT DOCUMENT (CUSTOMER)*>                
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>                     
<!ATTLIST CUSTOMER
    CUSTOMER_ID ID #REQUIRED>
]>
<DOCUMENT>
    <CUSTOMER CUSTOMER_ID = "C1232231">
.
.
.
    </CUSTOMER>
    <CUSTOMER CUSTOMER_ID = "C1232232">
            .
.
.
    </CUSTOMER>
</DOCUMENT>

◆ IDREF
IDREF 형식은 문서의 구조에 대한 내용을 지정하기 위한 속성을 사용하고자 할 때 지정합니다. 특히 구성요소들 사이의 관계에 대한 내용을 지정하기 위해 사용하며 IDREF 속성은 문서의 다른 구성요소에 대한 ID값을 저장합니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [                           
<!ELEMENT DOCUMENT (CUSTOMER)*>                
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>                     
<!ATTLIST CUSTOMER
    CUSTOMER_ID ID #REQUIRED
    EMPLOYER_ID IDREF #IMPLIED>
]>
<DOCUMENT>
    <CUSTOMER CUSTOMER_ID = "C1232231">
.
.
.
    </CUSTOMER>
    <CUSTOMER CUSTOMER_ID = "C1232232" EMPLOYER_ID="C1232231">
.
.
.
    </CUSTOMER>
</DOCUMENT>
위와 같이 문서의 일반적인 중첩 구조에 반영되어 있지 않은 부모-자식 관계를 설정하고자 하는 경우 구성요소의 IDREF 속성에 부모에 해당하는 구성요소의 ID를 지정합니다.
XML 처리기는 문서의 ID와 IDREF 구조를 내부 응용 프로그램으로 전달해주고, 응용 프로그램에서는 그 정보를 사용하여 문서의 구성요소 간의 관계를 재구성하루 수 있습니다.
반응형
반응형

◆ NMTOKEN
이 형식은 하나 이상의 알파벳, 숫자, 하이픈(-), 밑줄(_), 콜론(:), 마침표(.)로 구성된 값들만을 허용하며 공백을 포함 시킬 수 없습니다.
NMTOKEN 속성 값은 C++, Java, JavaScript의 변수에 적합한 이름과 매우 유사하므로 이들 이름을 내부 응용프로그램에서 자연스럽게 사용할 수 있습니다.

아래 예는 SHIP_STATE 라는 속성 이름을 선언하여 주문 내용이 선적되는 지역의 2글자 코드를 저장하도록 하고 이 속성을 NMTOKEN으로 하여 속성값이 하나 이상의 단어가 될 가능성을 배제시킵니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [                           
<!ELEMENT DOCUMENT (CUSTOMER)*>                
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>                     
<!ATTLIST CUSTOMER
    SHIP_STATE NMTOKEN #REQUIRED>
]>
<DOCUMENT>
    <CUSTOMER SHIP_STATE = "CA">
        <NAME>
            <LAST_NAME>Smith</LAST_NAME>
            <FIRST_NAME>Sam</FIRST_NAME>
        </NAME>
        <DATE>October 15, 2003</DATE>
        <ORDERS>
            <ITEM>
                <PRODUCT>Tomatoes</PRODUCT>
                <NUMBER>8</NUMBER>
                <PRICE>$1.25</PRICE>
            </ITEM>
            <ITEM>
                <PRODUCT>Oranges</PRODUCT>
                <NUMBER>24</NUMBER>
                <PRICE>$4.98</PRICE>
            </ITEM>
        </ORDERS>
    </CUSTOMER>
    <CUSTOMER SHIP_STATE = "LA">
        <NAME>
            <LAST_NAME>Jones</LAST_NAME>
            <FIRST_NAME>Polly</FIRST_NAME>
        </NAME>
        <DATE>October 20, 2001</DATE>
        <ORDERS>
            <ITEM>
                <PRODUCT>Bread</PRODUCT>
                <NUMBER>12</NUMBER>
                <PRICE>$14.95</PRICE>
            </ITEM>
            <ITEM>
                <PRODUCT>Apples</PRODUCT>
                <NUMBER>6</NUMBER>
                <PRICE>$1.50</PRICE>
            </ITEM>
        </ORDERS>
    </CUSTOMER>
</DOCUMENT>


◆ NMTOKENS
NMTOKENS 속성 형식은 공백으로 구분되는 여러 개의 NMTOKEN들로 속성값을 구성하도록 지정할 수 있습니다.
아래 예는 CONTACT_NAME 속성에 NMTOKENS 형식을 지정해 성과 이름을 공백으로 구분하여 지정하도록 합니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [                           
<!ELEMENT DOCUMENT (CUSTOMER)*>                
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>                     
<!ATTLIST CUSTOMER
    CONTACT_NAME NMTOKENS #IMPLIED>
]>
<DOCUMENT>
    <CUSTOMER CONTACT_NAME = "George Starr">
        <NAME>
            <LAST_NAME>Smith</LAST_NAME>
            <FIRST_NAME>Sam</FIRST_NAME>
        </NAME>
        <DATE>October 15, 2003</DATE>
        <ORDERS>
            <ITEM>
                <PRODUCT>Tomatoes</PRODUCT>
                <NUMBER>8</NUMBER>
                <PRICE>$1.25</PRICE>
            </ITEM>
            <ITEM>
                <PRODUCT>Oranges</PRODUCT>
                <NUMBER>24</NUMBER>
                <PRICE>$4.98</PRICE>
            </ITEM>
        </ORDERS>
    </CUSTOMER>
    <CUSTOMER CONTACT_NAME = "Ringo Harrison">
        <NAME>
            <LAST_NAME>Jones</LAST_NAME>
            <FIRST_NAME>Polly</FIRST_NAME>
        </NAME>
        <DATE>October 20, 2001</DATE>
        <ORDERS>
            <ITEM>
                <PRODUCT>Bread</PRODUCT>
                <NUMBER>12</NUMBER>
                <PRICE>$14.95</PRICE>
            </ITEM>
            <ITEM>
                <PRODUCT>Apples</PRODUCT>
                <NUMBER>6</NUMBER>
                <PRICE>$1.50</PRICE>
            </ITEM>
        </ORDERS>
    </CUSTOMER>
</DOCUMENT>

반응형
반응형

속성을 선언할 때에는 사용할 수 있는 기본값의 형식도 지정할 수 있습니다.

◆ CDATA
가장 간단한 속성 형식으로 간단한 문자 데이터를 가리킵니다.
마크업을 사용할 수 없으며, <, ", & 등의 문자들을 포함하는 문자열을 사용할 수 없습니다. 이런 문자를 사용하기 위해서는 미리 정의된 엔티티 참조(&lt;, &quot;, &amp;)를 사용해야합니다. 이들 엔티티 참조는 문서가 파싱될때 해당 문자로 바뀌게 됩니다.
<!ATTLIST CUSTOMER
    OWES CDATA "0"
    LAYAWAY CDATA "0"
    DEFAULTS CDATA "0"
>
]>


◆ 나열형
사용할 수 있는 값들의 목록을 지정합니다. 사용할 수 있는 각 값들은 첫 번째 글자가 반드시 알파벨 또는 밑줄(_)인 유효한 XML 이름이어야 합니다.
속성에 사용할 수 있는 값의 범위를 설정하고자 할 때 사용할 수 있습니다.(예 : 참|거짓, 요일 등등)
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [                           
.
.
.

<!ATTLIST CUSTOMER
    CREDIT_OK (TRUE | FALSE) "TRUE">
]>
<DOCUMENT>
    <CUSTOMER CREDIT_OK = "FALSE">
.
.
.

    </CUSTOMER>
</DOCUMENT>


◆ NOTATION
비-XML 데이터 형식을 가리키며, 외부 엔티티를 나타내기 위해 사용합니다.
가장 잘 알려진 형식으로는 image/gif, application/xml, text/html 등의 MIME형식이 있습니다.
NOTATION을 선언하려면 DTD에서 <!NOTATION> 구성요소를 사용해야 합니다.
<?xml version = "1.0" standalone="no"?>
<!DOCTYPE DOCUMENT [
.
.
.

<!NOTATION GIF SYSTEM "image/gif">
<!NOTATION JPG SYSTEM "image/jpeg">

<!ATTLIST CUSTOMER
IMAGE NMTOKEN #IMPLIED
IMAGE_TYPE NOTATION (GIF | JPG) #IMPLIED>
]>
<DOCUMENT>
<CUSTOMER IMAGE="image.gif" IMAGE_TYPE="GIF">
.
.
.

</CUSTOMER>
</DOCUMENT>
반응형
반응형

속성에 지정할 수 있는 기본 값의 종류를 살펴보면서, DTD에서 속성을 선언하는 방법을 알아보겠습니다.


◆ 직접적인 값

<!ATTLIST> 구성요소의 속성 선언에서 인용부호에 값을 직접 지정하여 속성의 기본 값을 지정할 수 있습니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [     
.
.
.

<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>                     
<!ATTLIST CUSTOMER
    OWES CDATA "0"
    LAYAWAY CDATA "0"
    DEFAULTS CDATA "0"
>
]>
<DOCUMENT>
    <CUSTOMER OWES="$12.13" LAYAWAY="$0" DEFAULTS="0">
        <NAME>
            <LAST_NAME>Smith</LAST_NAME>
.
.
.

</DOCUMENT>


◆ #REQUIRED

기본값을 직정 지정하지 않지만 DTD를 사용하는 사람이 직접 값을 지정해야만 합니다.
문서에서 구성요소에 대한 추가 정보를 필요로 하는 경우에 유용하게 사용할 수 있습니다.
(이름, 이메일 주소, URI 등등)
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
.
.
.

<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST CUSTOMER
    OWES CDATA #REQUIRED>

]>
<DOCUMENT>
    <CUSTOMER OWES="$0">
        <NAME>
            <LAST_NAME>Smith</LAST_NAME>
.
.
.

</DOCUMENT>


◆ #IMPLIED

속성의 기본 값으로 지정할 만한 것이 없으며, 문저의 작성자들도 이 속성을 사용할 필요가 없는 경우에 사용합니다.
XML 처리기에서 이 속성이 사용되지 않더라도 문제가 발생하지 않기 때문에 문서 작성자가 이 속성을 포함시킬 수는 있지만 반드시 포함시킬 필요는 없습니다.
속성들을 #IMPLIED로 선언하는 것이 일반적이며 그 이유는 작성자에 따라 그 속성들이 구성요소에 필요할 수도 있고 그렇지 않을 수도 있기 때문입니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
.
.
.

<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST CUSTOMER
OWES CDATA #IMPLIED>
]>
<DOCUMENT>
<CUSTOMER OWES="$23.99">
<NAME>
.
.
.

</ORDERS>
</CUSTOMER>
<CUSTOMER>
<NAME>
.
.
.

</ORDERS>
</CUSTOMER>
</DOCUMENT>


◆ #FIXED

#FIXED 키워드를 사용하면 속성들이 항상 고정된 값을 갖도록 구성할 수 있습니다. 속성에 대해 고정된 값을 설정해야 하므로 그 값을 지정해 주어야합니다.
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
.
.
.

<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST CUSTOMER
LANGUAGE CDATA #FIXED "EN">
]>
<DOCUMENT>
<CUSTOMER>
.
.
.


</CUSTOMER>


</DOCUMENT>

위 문서에서는 <CUSTOMER>구성요소에 LANGUAGE 속성을 사용하지 않고 있음을 알 수 있는데 속성이 #FIXED로 선언되어 있기 때문에 XML 처리기에서는 상관하지 않고 그 속성과 값을 내부 응용프로그램에 전달하게 됩니다.
만약 지정해 놓은 기본값을 다지 지정하려고 하면 XML 처리기는 오류를 발생합니다.
반응형
반응형

속성은 이름과 값을 한 쌍으로 이루어 시작 태그와 내용이 빈 태그에 추가 정보를 지정하기 위해 사용합니다.
예를 들면 다음과 같은 형태입니다.
<CUSTOMER LAST_NAME="Smith" FIRST_NAME="Sam" DATA="July 10, 2011 PURCHASE="Tomatoes" PRICE="$1.25" NUMBER="8" />


◆ DTD에서 속성 선언하기

문서가 유효하기를 바란다면 사용하는 모든 속성들을 이전에 미리 선언해놓아야 합니다. 그리고 속성에 기본값을 지정하거나 DTD를 사용하는 XML 작성자가 속성값을 할당하도록 요청할 수도 있습니다.

<!ATTLIST> 구성요소를 통해 구성요소의 목록을 선언합니다.
<!ATTLIST 구성요소_이름
속성_이름   형식   기본값
속성_이름   형식   기본값
.
.
.
속성_이름   형식   기본값>

태그 안의 요소들은
구성요소_이름 : 속성을 사용하고자하는 구성요소의 이름
속성_이름 : 선언하고자 하는 속성의 이름
형식 : 속성의 형식
기본값 : 속성의 기본값
을 가리킵니다.


◆ 속성의 형식에 사용할 수 있는 값들

- CDATA : 아무런 마크업을 포한하지 않는 단순한 문자 데이터
- ENTITIIES : DTD에 선성되어 있는 다중 엔티티 이름으로 공백을 구분
- ENTITY : DTD에 선언되어 있는 엔티티 이름
- "나열형" : 값들의 목록을 타나태며, 목록 중에 있는 어떤 값이 속성 값이 됨
- ID : 고유해야 하는 적절한 XML 이름(ID 형식으로 다른 속성과 공유되면 안 됨)
- IDREF : 어떤 구성요소의 ID 속성값을 저장
- IDREFS : 공백으로 구분된 여러 개의 구성요소 ID
- NMTOKEN : 토큰 이름으로 하나 이상의 글자, 숫자, 하이픈(-), 밑줄, 콜론(:), 마침표(.) 등으로 구성
- NMTOKENS : 목록에 나열되는 여러 개의 공백으로 구분된 NMTOKEN들
- NOTATION : DTD에 선언되어 있는 notation 이름


◆ 기본값 설정으로 사용할 수 있는 것들

- 값(Value) : 인용부호에 포함된 단순한 텍스트값
- #IMPLIED : 해당 속성에 대한 기본값이 없음을 나타내며 이 속성은 사용되지 않을 수 있음
- #REQUIRED : 해당 속성의 기본 값은 없지만 반드시 값을 지정해야만 해당 문서가 유효함
- #FIXED : ""은 속성의 값을 가리키며, 속성은 항상 이 값을 가져야 함

반응형
반응형

파라미터 엔티티는 문서의 DTD에서 사용하는 엔티티를 말합니다.

일반 엔티티는 DTD에서 문서의 내용에 들어가는 텍스트를 삽입하기 위해서는 사용할 수 있지만 DTD의 선언에는 사용할 수 없습니다. 그래서 파라미터 엔티티를 구성요소와 속성 선언 시에 사용합니다.

파라미터 엔티티 참조는 DTD에서만 사용할 수 있으며, DTD에 선언에 사용된 모든 파라미터 엔티티 참조는 DTD의 외부에 존재하는 DTD의 일부분인 외부 서브셋(externet subset)에서만 사용할 수 있습니다. 내부 서브셋에서는 파라미터 엔티티를 사용할 수 있지만 제한적인 방법으로만 가능합니다.

파라미터 엔티티의 참조는 %로 시작하여 ;로 끝나며
<!ENTITY % 이름 정의>
와 같은 형태로 작성합니다.

외부 파라미터 엔티티는 다음과 같이 SYSTEM과 PUBLIC 키워드를 사용하여 선언할 수 있습니다.
<!ENTITY % 이름 SYSTEM URI>
<!ENTITY % 이름 SYSTEM FPI URI>


◆ 내부 파라미터 엔티티

BR 이라는 이름으로 <!ELEMENT BR EMPTY>텍스트를 나타내는 파라미터 엔티티를 선언하는 방법입니다. 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DOCUMENT [
<!ENTITY % BR "<!ELEMENT BR EMPTY>">
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME, DATE, ORDERS)>
<!ELEMENT NAME (LAST_NAME, FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, PRICE)>
<!ELEMENT PRODUCT (#PCDATA)>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
%BR;
]>

위와 같은 경우 파라미터 엔티티를 선언하는 것 보다 ELEMENT를 직접 추가하는 편이 편합니다. 내부 파라미터 엔티티는 다른 선언문에 사용할 수 없기 때문에 내부 파라미터 엔티티로 할 수 있는 일은 많지 않습니다. 그래서 실제로 파라미터 엔티티의 용도를 이해하는데는 외부 파라미터 엔티티를 살펴보는 것이 좋습니다.


◆ 외부 파라미터 엔티티

DTD의 외부 서브셋 파라미터 엔티티를 사용할 때, 구성요소 선언을 포함한 DTD의 모든 곳에서 그 엔티티를 참조할 수 있습니다.
<!ENTITY % record "(NAME,DATE,ORDERS)">
<!ELEMENT DOCUMENT (CUSTOMER | BUYER | DISCOUNTER)*>                
<!ELEMENT CUSTOMER %record;>         
<!ELEMENT BUYER  %record;>         
<!ELEMENT DISCOUNTER  %record;>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>

<CUSTOMER>,<BUYER>,<DISCOUNTER>가 서로 동일한 내용 모델을 가지므로 시간 절약을 위해 record라는 파라미터 엔티티를 지정합니다.

즉, 위와 같이 자주 반복되는 텍스트들을 DTD의 구성요소 선언에서 처리하기 위해 파라미터 엔티티를 사용합니다. 이렇게 파라미터 엔티티를 사용하면 DTD 구성요소의 선언을 수정할 필요가 있을 때 각 선언을 모두 수정하지 않고 파라미터 엔티티만을 수정하면 됩니다.


◆ INCLUDE와 IGNORE 사용하기

INCLUDE와 IGNORE는 DTD의 일부 구역을 포함하거나 제외시키기 위해 사용되는 명령어 입니다..
이 두 DTD명령어를 파라미터화 시켜 놓으면 파라미터 값을 INCLUDE또는 IGNORE로 바꾸기만 하면 DTD의 여러 구역을 포함 시키거나 제외 시킬 수 있습니다.
아래 DTD에서 빨갛게 표시한 INCLUDE 부분을 IGNORE로 바꾸면 PRODUCT_ID,SHIP_DATE, SKU 요소가 DTD에서 제외 되는 것입니다.
<!ENTITY % includer "INCLUDE">
<!ELEMENT DOCUMENT (CUSTOMER)*>                
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>         
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>           
<!ELEMENT LAST_NAME (#PCDATA)>                  
<!ELEMENT FIRST_NAME (#PCDATA)>                 
<!ELEMENT DATE (#PCDATA)>                      
<!ELEMENT ORDERS (ITEM)*>                      
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>         
<!ELEMENT PRODUCT (#PCDATA)>                   
<!ELEMENT NUMBER (#PCDATA)> 
<!ELEMENT PRICE (#PCDATA)>
<![ %includer; [
<!ELEMENT PRODUCT_ID (#PCDATA)>
<!ELEMENT SHIP_DATE (#PCDATA)>
<!ELEMENT SKU (#PCDATA)>
]]>

반응형
반응형

DTD에는 속성(attribute)와 엔티티(entity) 를 선언할 수 있습니다.

엔티티(entity)
 엔티티란 데이터 항목을 참조하기 위한 XML의 방법으로 보통은 텍스트이지만 이진 데이터로 구성될 수도 있습니다.
 엔티티는 DTD에서 선언하며, 문서에서 참조를 통해 사용됩니다.
 XML문서의 내용에 사용되는 일반 엔티티의 참조는  &로 시작하여 ;로 끝나게 되며, DTD에서 사용하는 파라미터 엔티티의 참조는 %로 시작하여 ;로 끝나게 됩니다.


◆ 미리 정의되어 있는 일반 엔티티 참조

&amp;  -  &
&apos;  -  '
&gt  -  >
&lt  -  <
&quot  -  "

<?xml version="1.0" encoding="UTF-8"?>
<TEXT>
 This text about the &quot;S&amp;O Railroad&quot; is the &lt;TEXT&gt; element&apos;scontent.
</TEXT>


자신이 원하는 문자의 문자코드를 인코딩에 맞추어 지정해서 엔티티 참조를 만들 수도 있습니다.
예를 들어 UTF-8 인코딩에서 @의 문자 코드가 #64이므로 &#64; 라는 엔티티 참조는 @를 나타내게 됩니다.
<!ENTITY at "&#64;">
위와 같은 엔티티를 정의하면 &at; 이 @을 나타내게 됩니다.


◆ 내부 일반 엔티티 만들기

문서 내부에 <!ENTITY> 구성요소를 사용하여 <!ENTITY 이름 정의>형식으로 엔티티를 선언합니다.
&엔티티이름; 형태의 엔티티 참조를 통해 정의한 내용으로 바뀌게 됩니다.
<?xml version="1.0" encoding="UTF-8"?>

.
.

.



<!ENTITY TODAY "October 15, 2003">

]>
<DOCUMENT>
 <CUSTOMER>
  <NAME>
   <LAST_NAME>Smith</LAST_NAME> 
   <FIRST_NAME>Sam</FIRST_NAME>
  </NAME>
  <DATE>&TODAY;</DATE>
  <ORDERS>

.
.

.


아래와 같은 결과를 보실 수 있습니다.



일반 엔티티의 참조는 중첩해서 사용할 수 있습니다.
<!ENTITY NAME "Alfred Hitchcock">
<!ENTITY SIGNATURE "&NAME; 14 Mystery Drive">

단 아래와 같이 순환하여 참조하는 경우는 XML 처리기가 그 결과를 예측할 수 없기 때문에 참조할 수 없습니다.
<!ENTITY NAME "Alfred Hitchcock &SIGNATURE;">
<!ENTITY SIGNATURE "&NAME; 14 Mystery Drive">

그리고 일반 엔티티 참조는 아래 처럼 문서 자체가 아닌 DTD 에서만 사용되는 텍스트를 삽입하기 위한 경우도 사용할 수 없습니다.
<!ENTITY TAGS "NAME, DATE, ORDERS)">
<!ENTITY CUSTOMER &TAGS;>



◆ 외부 일반 엔티티 만들기

엔티티는 문서의 외부에 존재할 수 있는데, 이때는 XML 처리기가 엔티티를 찾을 수 있도록 URI를 제공해야 합니다.
외부 엔티티는 단순한 문자열, 문서 전체 또는 문서의 일부분이 될 수 있습니다. 그리고 XML 처리기의 관점에서 그 문서가 잘 구성되어야(well-formed) 하며 유효해야(valid)합니다.

외부의 ex_entity.xml 파일에 "July 6, 2011"이라는 텍스트가 저장되어 있으면

 

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

.
.

.


<!ELEMENT PRICE (#PCDATA)>
<!ENTITY TODAY SYSTEM "ex_entity.txt">
]>
<DOCUMENT>
 <CUSTOMER>
  <NAME>
   <LAST_NAME>Smith</LAST_NAME> 
   <FIRST_NAME>Sam</FIRST_NAME>
  </NAME>
  <DATE>&TODAY;</DATE>
  <ORDERS>

.
.

.

</DOCUMENT>


위와 같이 엔티티 구성요소를 추가해서 TODAY라는 엔티티를 추가할 수 있습니다. 아래와 같은 결과를 볼 수 습니다.



◆ 조각들을 이용해 문서 만들기

외부 일반 엔티티를 사용하여 여러 조각을 이용해 문서를 구성할 수 있습니다. <DOCUMENT>요소 안의 내용을 &data; 로 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME, DATE, ORDERS)>
<!ELEMENT NAME (LAST_NAME, FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, PRICE)>
<!ELEMENT PRODUCT (#PCDATA)>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ENTITY data SYSTEM "ch04_06.xml">
]>
<DOCUMENT>
 &data;
</DOCUMENT>

그리고 &data;로 참조될 <DOCUMENT>요소의 하위 요소 들을 외부 파일에 작성합니다.



브라우저에서 두 문서가 합쳐진 아래와 같은 결과를 보실 수 있습니다.

반응형

'컴퓨터&IT > XML' 카테고리의 다른 글

XML - [6] DTD:속성(Attribute)  (0) 2011.08.24
XML - [5] DTD:파라미터 엔티티  (0) 2011.08.24
XML - [3] Well-formed Document 와 Valid Document  (0) 2011.08.24
XML - [2] XML의 장점  (0) 2011.08.24
XML - [1] Markup Language  (0) 2011.08.24
반응형

XML 브라우저는 문서가 Well-formed Document인지 그리고 Valid Document 인지 확인합니다.
그럼 이 두 가지가 무슨 의미인지 알아보겠습니다.


Well-formed Document (잘 구성된 문서)

W3C에서 XML1.0 규격에 명시해 놓은 문법을 따르는 문서를 말합니다. 비공식적으로는 문서가 하나 이상의 구성요소를 포함해야하며, 하나 이상의 루트 구성요소가 다른 구성요소들을 포함하고 있어야함을 의미합니다. 또한 각 구성요소들은 적절히 쌍을 이루고 있어야합니다. <GREETING>으로 시작했다면 </GREETING>으로 끝나야겠죠? 그래서 아래 문서는 Well-formed Document라고 할 수 없는 것입니다.

<DOCUMENT>
<GREETING>
Hello XML
<MESSAGE>
</GREETING>

Welcome~~~!!
</MESSAGE>
</DOCUMENT>

 
Valid Document (유효한 문서)

대부분의 XML 브라우저들은 문서가 잘 구성되었는지를 확인하는데 일부 브라우저에서는 문서의 유효성까지도 확인합니다. 만약 문서가 DTD(Document Type Definition)이나 XML스키마에 연결되어 있고, 문서가 이들을 만족한다면 Valid Document라고합니다.
반응형

'컴퓨터&IT > XML' 카테고리의 다른 글

XML - [6] DTD:속성(Attribute)  (0) 2011.08.24
XML - [5] DTD:파라미터 엔티티  (0) 2011.08.24
XML - [4] DTD:엔티티(일반 엔티티)  (0) 2011.08.24
XML - [2] XML의 장점  (0) 2011.08.24
XML - [1] Markup Language  (0) 2011.08.24
반응형

쉬운 데이터 교환

일반적으로 응용프로그램끼리 데이터를 교환하려면 변환 프로그램이나 별도의 모듈이 필요합니다. 하지만 고유한 데이터 형식들이 복잡해 지면서 동일한 응용프로그램 조자 다른 버전의 데이터를 이전 버전에서 읽지 못하는 경우도 발생합니다.
XML은 데이터와 마크업은 문자열로 저장되어 직접 구성을 변경할 수 있습니다. 문제가 발생하더라고 모두 문자열로 구성되어 있기 때문에 직접 문서를 수정할 수도 있죠. 그리고 이들 데이터는 특허 또는 저작권 보호를 받는 어떤 방식으로도 코드화되지 않아서 접근성이 좋습니다.


마크업 언어의 사용자 정의

XML을 사용하면 사용자 정의가 가능한 마크업 언어를 만들 수 있습니다. 이미 수백 가지 언어들이 표준화 되어 있는데 한 가지 예를 들자면 CML(Chemical Markup Language)같은 새로운 마크업 언어를 통해 복잡한 분자들을 그래픽으로 표현하기도 합니다.


쉽게 알 수 있는 데이터

XML은 각 구성요소의 이름을 잘 지었다면 그 이름만으로도 어떤 내용인지 쉽게 알 수 있습니다. 이는 XML 문서 자체만으로도 충분한 설명이 될 수 있다는 것을 의미합니다.


구조화된 통합 데이터

XML은 데이터 뿐만 아니라 데이터의 구조도 지정할 수 있어서 다양한 구성요소들을 다른 구성요소에 어떻게 통합할 것인지를 지정할 수도 있습니다.

 
반응형
반응형


XML W3C에서 정의한 언어입니다. XML을 사용하여 자신의 구성 요소(element)들을 구성할 수 있으면 자신의 용도에 맞게 언어를 정의할 수 있습니다. XML에 대해 알아볼까요?


Markup Language(마크업 언어)

XML은 마크업 언어 입니다.
마크업 언어는 문서의 형식을 설명하는 모든 것을 가리킵니다. 예를 들자면 아래와 같이 표준 웹 페이지를 작성할 때 사용 되는 HTML(Hyper Text Markup Language)가 있습니다.

  <TITLE>태그는 제목 표시줄에 나타나는 내용을 의미하고
  <H1> 태그는 헤드라인을 의미합니다.
 

<HTML>
<HEAD>
<TITLE>Hello HTML</TITLE>
</HEAD>
<BODY>
<H1>Hello HTML</H1>
Welcome~~~~!!
</BODY>
</HTML>



HTML은 모든 구성요소들이 미리 정의되어 있어 사용에 충분치 못합니다. 예를 들면 <BODY>슬기</BODY>를 넣으면 그것이 텍스트인지는 알 수 있지만 '슬기'라는 명사인지, 누군가의 이름인지 명확히 구분하지 못합니다.
 
반면에 XML은 자신의 마크업 태그를 정의할 수 있기 때문에 <name>이라는 테그를 사람의 이름으로 정의하고 <name>슬기</name> 라고 적어 준다면 슬기라는 텍스트가 누군가의 이름이라는 의미를 가지게 되는 것이죠.

위와 같은 의미에서 XML을 메타-마크업 언어 라고 하기도 합니다.

그러면 XML은 어떻게 생긴 마크업 언어일까요?

<?xml version\"1.0" encoding="UTF-8"?>
<DOCUMENT>
<GREETING>
Hello XML.
</GREETING>
<MESSAGE>
Welcome~~~~!
</MESSAGE>
</DOCUMENT>


우선 "<?"로 시작하여 "?>"로 끝나는 부분은 XML 처리문 입니다. 현재 사용된 XML 버전과 문자 인코딩 정보 등을 나타냅니다.

모든 XML 태그는 "<" 로 시작하여 ">"로 끝납니다. 태그의 이름으로는 알파벳 또는 밑줄(_)로 시작하여 알파벳, 숫자, 문자, dot(.), 또는 하이픈(-)으로 구성된 모든 이름을 사용할 수 있습니다. 단 공백은 허용 되지 않습니다.

그리고 <DOCUMENT> 와 같은 시작태그로 시작하고 구성요소에는 텍스트나 또는 다른 구성용소 같은 어떤 내용도 포함 할 수 있으며, </DOCUMENT>와 같이 "</"로 시작하는 종료 태그로 끝나게 됩니다.

또 처리문은 제외하고 전체 문서는 하나의 구성요소에 포함 시켜야 하며 이를 root 구성요소라고 합니다. 위의 예에서는 <DOCUMENT>가 root구성요소입니다.

<GREETING>과 <MESSAGE>는 텍스트를 포함하고 있으며 이 둘은 root구성요소인 <DOCUMENT>에 포함됩니다.



HTML문서의 모든 태그는 미리 정의되어 있어 브라우저에서 이들은 처리하는 방식에 대해 잘 알고 있지만 새로 만들어낸 태그를 포함하는 XML 문서를 사용하기 위해서는 사람이 직접 구성요소에 의미를 부여하는 작업을 해야합니다.

새로 만든 구성요소에 의미를 부여하는 방법엔 크게 두가지가 있는데 첫 번째는 스타일 시트를 사용하여 새로 만든 구성요소들의 표시 형힉을 브라우저에 지정하는 것이고 두 번째는 프로그래밍 언어를 사용하여 XML 문서를 프로그래밍 코드로 처리하는 것입니다.



 

반응형

+ Recent posts