출처 : http://kr.blog.yahoo.com/kwon37xi/1236311.html
(더 좋은 화면 있습니다.^^;)
DTD ?
- Document Type Definition - 문서 형 정의
- DTD 선언은 데이터 안에 포함하거나 별도의 다른 문서로 존재할 수 있다. DTD는 XML 데이터의 구조와
내용을 나타내는 규칙을 정의한다. 단 하나의 DTD만이 XML 문서와 데이터 객체에 연관될 수 있다.
- 내부/외부 서브셋
- 내부 서브셋 : DTD 선언을 XML 데이터 내부에 포함.
- 외부 서브셋 : DTD 선언이 다른 문에서 위치. .dtd 파일
- 내부 서브셋에 있는 DTD 선언은 외부 서브셋에 있는 선언보다 우선순위가 높다. 유사한 선언이
양쪽에 존재할 때, 내부 서브셋의 선언이 사용된다.
- 내부 서브셋 : DTD 선언을 XML 데이터 내부에 포함.
XML과 DTD 연결
- DOCTYPE 선언을 이용한다.
- XML문서내에 DOCTYPE선언은 단 한번만 나올 수 있다.
- XML 선언 바로 다음에 나와야 한다.
SYSTEM
- doc_element란 문서의 root 요소를 의미한다.
- 내부 서브셋은 선택적이다.
- SYSTEM 키워드는 DTD의 위치를 명시적으로 가리키는데 사용한다. URL형식을 사용한다.
- 예
- 반드시 파일이나 지정된 URL에 접근 가능한 권한이 있어야만 한다.
PUBLIC
- PUBLIC 키워드는 내부 시스템과 SGML 애플리케이션에서 사용하도록 제한되어 있다.
- 예
- PUBLIC 위치에서 DTD를 검색하는 것은 DTD를 애플리케이션(파서)이 알아서 찾아서 처리하라는 뜻이다.
- 보통 PUBLIC 식별자와 함께 SYSTEM 스타일의 위치 지정. PUBLIC 위치를 사용할 수 없을 경우 대체 위치 제공.
내부 서브셋
...
DTD 선언
- DTD 선언은 형태로 한다.
- 공백문자는 여러개를 사용해도 된다.
- 단, 에서 !와 keyword 사이에는 공백이 없다.
DTD 키워드
키워드 | 설명 |
ELEMENT | XML 요소 형이름과 허가된 하위 요소들(자식)을 기술한다. |
ATTLIST | XML 요소 속성 이름과 허가된 또는 기본 속성 값을 기술한다. |
ENTITY | 특별한 문자 참조. 텍스트 매크로, 외부 소스의 반복되는 내용을 기술한다. |
NOTATION | 외부의 비 XML 내용(예를 들어, 바이너리 이미지 데이터)과 그 내용을 처리하는 외부 애플리케이션 기술. |
* ELEMENT, ATTLIST, ENTITY가 핵심이다.
요소 형(ELEMENT) 선언
아래 두 가지 형태의 선언이 있다.- name : 요소의 이름.
- content_category와 content_model은 이 요소가 포함할 수 있는 내용의 종류를 의미한다.
Content Category
어떤 데이타가 올 수 있는가?Any
- Well-Formed 인 XML 아무거나 올 수 있다. 유효성 검사를 무력화 시키므로 사용하지 말 것.
Empty
- 속성 이외에는 아무것도 올 수 없다. HTML의 img 태그 등이 그 예이다.
- 예
Content Model
- 요소 선언에서 내용 모델(Content Model)은 요소 형의 구조와 내용을 기술하기 위해 사용한다.
- 쉽게 말하면, 요소안에 어떤 다른 요소가 어떤 순서로 몇 개 올수 있는가. 아니면 텍스트만 올 수 있는가 등을 지정한다.
- 내용 모델은 세가지로 나눌 수 있다.
- Text Only : 문자 데이타만 올 수 있다. 자식 요소는 올 수 없다.
- Element Only : 자식 요소만 올 수 있다. 자식 외부에 텍스트를 둘 수 없다.
- Mixed : 자식 요소와 텍스트 혼합.
- Text Only : 문자 데이타만 올 수 있다. 자식 요소는 올 수 없다.
- ANY나 EMPTY 카테고리에서 내용 모델이 필요없다.
- cardinality 란 내용 모델이 몇개 반복 될 수 있는지 결정하는 것이다.
- 순차와 선택 리스트
- 순차 리스트 : 자식 요소들이 지정된 순서대로 나와야 한다. 자식 요소들의 이름을 구분하기 위해 쉼표(,)를 사용.
- 선택 리스트 : 지정된 자식 요소들 중에서 단 한개만 나타날 수 있다.
- 순차 리스트 : 자식 요소들이 지정된 순서대로 나와야 한다. 자식 요소들의 이름을 구분하기 위해 쉼표(,)를 사용.
Text-Only(PCDATA)
- #PCDATA로 지정한다.
PCDATA 카테고리를 가진 요소는 실제 데이터와 엔티티 참조만을 허용한다.
어쩌구 저쩌구 메롱~~
Eelement-Only
자식 요소만을 포함한다. 지정된 자식 요소만을 포함할 수 있다. 자식 요소의 외부에 텍스트를 포함할 수 없다.다음과 같다. 결코 자식요소 외부에 문자열이 올 수 없다.
haha some message hi~
혼합 내용
- 일반 텍스트와 a_child_element, another_child 요소가 올 수 있다. 카디널리티 연산자로 *를 지정했기 때문에 순서 없이 올 수 있다.
- #PCDATA 키워드는 사용할 때마다 항상 내용 모델의 첫째 항목으로 나타나야 한다. 그리고나서 자식 요소 형 이름이 나와야 한다.
- HTML의 body 태그가 대표적인 혼합 내용 요소이다.
순차/선택 리스트 복합 사용
- Mr, Ms, Dr, Rev 요소 중의 하나만 먼저 나오고 그 다음 FirstName, MiddleName, LastName 이 순서대로 나오고, 다시 Jr, Sr, III 요소 중의 하나만 마지막으로 나올 수 있다.
길동 중간이름도 있나? 홍
카디널리티 연산자
- 카디널리티 연산자는 내용 모델에서 자식 요소들이 얼마나 많이 나타날 수 있는지를 정의한다.
카디널리티 연산자 | 설명 |
없슴 | 카디널리티 연산자가 없으면 자식 요소의 인스턴스가 단 한번, 필히! 나타남. |
? | 0번 또는 1번. 없거나 하나만 있거나. |
* | 0번 또는 여러번. |
+ | 1번 또는 여러번. |
속성(ATTRIBUTE) 선언
- elementName은 속성들을 포함하고 있는 요소의 이름이다.
- attrName은 속성의 이름이다.
- attrType은 속성의 형이다.
- attrDefaultN 은 속성이 반드시 필요한지 아닌지 여부.
속성의 디폴트 값
속성 디폴트 | 설명 |
#REQUIRED | 속성은 요소의 모든 인스턴스에 반드시 나타나야 한다. |
#IMPLIED | 속성은 선택적이다. 있어도 좋고 없어도 좋고.. |
#FIXED(디폴트값과 함께 사용) | 속성은 선택적이다. 만약 속성이 사용되면 반드시 디폴트값과 일치해야한다. 속성이 없어도 파서가 디폴트 값을 제공해 줄 수 있다. |
디폴트값(키워드 없이 사용) | 속성은 선택적이다. 속성이 사용되면 그 값을 따르고, 속성이 사용되지 않으면 파서가 디폴트 값을 제공해 줄 수 있다. |
REQUIRED
IMPLIED
- its_attr 속성은 선택적이다.
- #IMPLIED에서는 디폴트 값 지정을 불허한다.
FIXED
- 속성의 값을 특정값으로 고정시킨다.
- Doc 요소에 version 속성이 있건 없건간에 무조건 "1.00"의 version 속성이 있다고 간주한다.
- 만약 version 속성에 "1.00"이외의 값이 들어가면 유효하지 않은 XML 문서이다.
haha 혹은..haha
- version 속성의 값을 하나의 값으로 제한하면서 모든 요소의 모든 인스턴스에서 사용되지 않아도 되게 하려면 #IMPLIED 키워드를 가진 열거 속성형을 사용하면 된다.
속성 형(Type)
10가지 형이 있다.CDATA(문자 데이터)
- 일반 텍스트
- AnElement의 속성 its_attr은 문자열 데이터를 가지며 필수적으로 있어야한다.
... - CDATA 속성값에는 외부엔티티 참조를 사용할 수 없다.
- 내부에 정의된 엔티티 참조는 사용할 수 있다.(<, >, &, ', ")
- 문자 참조는 사용할 수 있다.(A; 등..)
- "<" 문자는 올 수 없다. <로 대체하라.
열거형
- 지정된 텍스트 문자열 중의 하나만을 속성 값으로 사용한다.
- 실 사용예
John Q Public
ID 속성 형(요소 식별자)
- ID 형을 사용하는 속성은 요소의 인스턴스에서 유일하게 식별할 수 있는 이름을 제공한다.
ID 속성값은 XML 이름 규칙에 따라야 하고, 그 값은 사용하는 문서에서 유일해야 한다.
- 값은 숫자로 시작할 수 없다. 문자 + 숫자 형은 가능하다.
- 각 요소 형에서 ID는 단 한 개만 사용할 수 있다.
- 이 형의 모든 속성은 #IMPLIED 혹은 #REQUIRED로 선언해야 한다.
IDREF / IDREFS 속성 형 (요소 사이의 관계)
혹은, 한 책에 대한 저자가 여러명 일 수 있으므로
- IDREF 속성 값은 적합한 XML 이름이어야 하고, 같은 문서 내의 ID 속성 값과 일치해야 한다.
- 동일한 ID에 대해 여러 IDREF 링크들이 허용된다.
- IDREFS는 한 속성에 여러 ID 값들을 공백으로 구분하여 가질 수 있다.
NMTOKEN, NMTOKENS 속성 형
- NMTOKEN은 CDATA와 동일하지만, 공백 문자가 올 수 없다.
- NMTOKENS는 NMTOKEN이 한 속성에서 공백으로 구분되어 여러개 있는 것이다.
- 열거형과 CDATA형의 중간 형태.
...
ENTITY/ENTITIES 속성 형
- ENTITY의 이름을 속성의 값으로 지정한다. 엔티티의 이름을 지정할 때 "&"와 ";"는 뺀다.
- ENTITIES는 공백으로 구분하여 여러개의 엔티티를 지정할 수 있다.
NOTATION 형
- NOTATION 속성 값은 반드시 적절한 XML이름이어야 하고, 동일한 DTD내의 선언과 일치해야 한다.
- 각 요소 형에 대해 NOTAION 속성 하나가 존재할 수 있다.
- 이 속성 형은 EMPTY 요소와 함께 사용 될 수 없다.
Notation : 비 XML 데이터
- 텍스트가 아닌 바이너리 데이터 등을 다루기 위한 선언
- Notation은 XML 어플리케이션에서 파싱되지 않은 엔티티나 다른 비-XML 데이타를 다루기 위해 사용된다.
- 기본 선언 형태
일반 엔티티(ENTITY)
- 엔티티는 엔티티가 나오면 그 부분을 지정되 다른 문자열로 대체한다.
- 엔티티의 대체 문자열은 Well-Formed XML이어야 한다.
- 엔티티는 직접적으로 또는 간접적으로 자신의 이름을 참조할 수 없다. (즉, 재귀적인 참조가 허용되지 않는다.)
- 엔티티에 속성 값의 끝 구분문자(" 혹은 ')를 포함할 수 없다.
- 엔티티를 참조하려면 &엔티티이름;와 같이 해야한다.
]>
&Disclaimer;
매개 변수 엔티티
- 매개 변수 엔티티는 DTD에서만 사용된다.
독립 문서 선언
- standalone 속성을 통해 XML 프로세서가 DOCTYPE 선언을 해석하는 방법 제공.
- yes : 문서는 자체에 포함되어 있으며 다른 데이터를 요구하지 않는다.
- no : 문서는 외부 DTD에 포함된 마크업을 사용한다.
DTD의 제약
- 비 XML 구문이다.
- DTD는 확장할 수 없다.
- 오직 하나의 DTD만이 문서와 결합할 수 있다.
- DTD는 XML 네임스페이스를 잘 지원하지 않는다.
- 매우 약한 데이터 형을 사용한다.
- 객체 지향 형의 개체 상속을 하지 못한다.
- 내부 서브셋을 사용하여 외부 서브셋을 무시할 수 있다.
- DOM을 지원하지 않는다.
- 상대적으로 오래되었다.