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

 | 캐리지 리턴 |

 | 라인피드 |
	 | 탭 |
\ | \ |
-
외부 일반 언파스드 엔티티 : 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>