반응형
DTD에는 속성(attribute)와 엔티티(entity) 를 선언할 수 있습니다.
엔티티(entity)
엔티티란 데이터 항목을 참조하기 위한 XML의 방법으로 보통은 텍스트이지만 이진 데이터로 구성될 수도 있습니다.
엔티티는 DTD에서 선언하며, 문서에서 참조를 통해 사용됩니다.
XML문서의 내용에 사용되는 일반 엔티티의 참조는 &로 시작하여 ;로 끝나게 되며, DTD에서 사용하는 파라미터 엔티티의 참조는 %로 시작하여 ;로 끝나게 됩니다.
◆ 미리 정의되어 있는 일반 엔티티 참조
& - &
' - '
> - >
< - <
" - "
<?xml version="1.0" encoding="UTF-8"?>
<TEXT>
This text about the "S&O Railroad" is the <TEXT> element'scontent.
</TEXT>
<TEXT>
This text about the "S&O Railroad" is the <TEXT> element'scontent.
</TEXT>
자신이 원하는 문자의 문자코드를 인코딩에 맞추어 지정해서 엔티티 참조를 만들 수도 있습니다.
예를 들어 UTF-8 인코딩에서 @의 문자 코드가 #64이므로 @ 라는 엔티티 참조는 @를 나타내게 됩니다.
<!ENTITY at "@">
위와 같은 엔티티를 정의하면 &at; 이 @을 나타내게 됩니다.◆ 내부 일반 엔티티 만들기
문서 내부에 <!ENTITY> 구성요소를 사용하여 <!ENTITY 이름 정의>형식으로 엔티티를 선언합니다.
&엔티티이름; 형태의 엔티티 참조를 통해 정의한 내용으로 바뀌게 됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY TODAY "October 15, 2003">
]>
.
.
.
<!ENTITY TODAY "October 15, 2003">
]>
<DOCUMENT>
<CUSTOMER>
<NAME>
<LAST_NAME>Smith</LAST_NAME>
<FIRST_NAME>Sam</FIRST_NAME>
</NAME>
<DATE>&TODAY;</DATE>
<ORDERS>
<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">
<!ENTITY SIGNATURE "&NAME; 14 Mystery Drive">
단 아래와 같이 순환하여 참조하는 경우는 XML 처리기가 그 결과를 예측할 수 없기 때문에 참조할 수 없습니다.
<!ENTITY NAME "Alfred Hitchcock &SIGNATURE;">
<!ENTITY SIGNATURE "&NAME; 14 Mystery Drive">
<!ENTITY SIGNATURE "&NAME; 14 Mystery Drive">
그리고 일반 엔티티 참조는 아래 처럼 문서 자체가 아닌 DTD 에서만 사용되는 텍스트를 삽입하기 위한 경우도 사용할 수 없습니다.
<!ENTITY TAGS "NAME, DATE, ORDERS)">
<!ENTITY CUSTOMER &TAGS;>
<!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>
.
.
.
.
<!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>
.
.
.
.
위와 같이 엔티티 구성요소를 추가해서 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">
]>
<!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>
그리고 &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 |