회사 내부 스터디에 사용한 것.
Professional XML 2nd ed.를 정리한 것임.
DTD ?
- Document Type Definition - 문서 형 정의
- DTD 선언은 데이터 안에 포함하거나 별도의 다른 문서로 존재할 수 있다. DTD는 XML 데이터의 구조와
내용을 나타내는 규칙을 정의한다. 단 하나의 DTD만이 XML 문서와 데이터 객체에 연관될 수 있다.
- 내부/외부 서브셋
- 내부 서브셋 : DTD 선언을 XML 데이터 내부에 포함.
- 외부 서브셋 : DTD 선언이 다른 문에서 위치. .dtd 파일
- 내부 서브셋에 있는 DTD 선언은 외부 서브셋에 있는 선언보다 우선순위가 높다. 유사한 선언이
양쪽에 존재할 때, 내부 서브셋의 선언이 사용된다.
XML과 DTD 연결
- DOCTYPE 선언을 이용한다.
- XML문서내에 DOCTYPE선언은 단 한번만 나올 수 있다.
- XML 선언 바로 다음에 나와야 한다.
SYSTEM
<!DOCTYPE doc_element SYSTEM location [내부 서브셋] >
PUBLIC
<!DOCTYPE doc_element PUBLIC identifier location [내부 서브셋] >
PUBLIC 위치에서 DTD를 찾지 못하면 SYSTEM 위치에서 찾는다. SYSTEM 키워드는 내부적으로 암시되어 있다.
내부 서브셋
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE Toysco PUBLIC "BigBusinessConsortium/Toysco"
"http://www.wrox.com/DTDs/Toysco.dtd"
[
DTD 선언 #1
DTD 선언 #2
...
]>
<!-- 외부 서브셋은 PUBLIC 키워드로 참조된다. -->
<!-- 내부 서브셋은 위의 "[]" 사이에 포함된다. -->
<Toysco>
...
</Toysco>
DTD 선언
- DTD 선언은 <!keyword param1 param2 ... paramN> 형태로 한다.
- 공백문자는 여러개를 사용해도 된다.
- 단, <!keyword 에서 !와 keyword 사이에는 공백이 없다.
DTD 키워드
키워드 | 설명 |
ELEMENT | XML 요소 형이름과 허가된 하위 요소들(자식)을 기술한다. |
ATTLIST | XML 요소 속성 이름과 허가된 또는 기본 속성 값을 기술한다. |
ENTITY | 특별한 문자 참조. 텍스트 매크로, 외부 소스의 반복되는 내용을 기술한다. |
NOTATION | 외부의 비 XML 내용(예를 들어, 바이너리 이미지 데이터)과 그 내용을 처리하는 외부 애플리케이션 기술. |
* ELEMENT, ATTLIST, ENTITY가 핵심이다.
요소 형(ELEMENT) 선언
아래 두 가지 형태의 선언이 있다.
<!ELEMENT name content_category>
<!ELEMENT name (content_model)>
- name : 요소의 이름.
- content_category와 content_model은 이 요소가 포함할 수 있는 내용의 종류를 의미한다.
Content Category
어떤 데이타가 올 수 있는가?
Any
<!ELEMENT AnythingGoesHere ANY>
- Well-Formed 인 XML 아무거나 올 수 있다. 유효성 검사를 무력화 시키므로 사용하지 말 것.
Empty
<!ELEMENT img EMPTY>
Content Model
<!ELEMENT name (content_model)cardinality>
- 요소 선언에서 내용 모델(Content Model)은 요소 형의 구조와 내용을 기술하기 위해 사용한다.
- 쉽게 말하면, 요소안에 어떤 다른 요소가 어떤 순서로 몇 개 올수 있는가. 아니면 텍스트만 올 수 있는가 등을 지정한다.
- 내용 모델은 세가지로 나눌 수 있다.
- Text Only : 문자 데이타만 올 수 있다. 자식 요소는 올 수 없다.
- Element Only : 자식 요소만 올 수 있다. 자식 외부에 텍스트를 둘 수 없다.
- Mixed : 자식 요소와 텍스트 혼합.
- ANY나 EMPTY 카테고리에서 내용 모델이 필요없다.
- cardinality 란 내용 모델이 몇개 반복 될 수 있는지 결정하는 것이다.
- 순차와 선택 리스트
- 순차 리스트 : 자식 요소들이 지정된 순서대로 나와야 한다. 자식 요소들의 이름을 구분하기 위해 쉼표(,)를 사용.
<!ELEMENT name (child1, child2) >
- 선택 리스트 : 지정된 자식 요소들 중에서 단 한개만 나타날 수 있다.
<!ELEMENT name (#PCDATA | child1 | child2) >
Text-Only(PCDATA)
문자열만 올 수 있다.
PCDATA 카테고리를 가진 요소는 실제 데이터와 엔티티 참조만을 허용한다.
<foo>
어쩌구 저쩌구 메롱~~
</foo>
Eelement-Only
자식 요소만을 포함한다. 지정된 자식 요소만을 포함할 수 있다. 자식 요소의 외부에 텍스트를 포함할 수 없다.
<!ELEMENT foo (a_child_element, another_child, a_third_child) >
다음과 같다. 결코 자식요소 외부에 문자열이 올 수 없다.
<foo>
<a_child_element>haha</a_child_element>
<!-- 이런 부분에 일반 텍스트는 올 수 없다!! 주석은 어디에나 올 수 있다.-->
<another_child>some message</another_child>
<a_third_child>hi~</a_third_cihld>
<!-- 여기에도 일반 텍스트는 올 수 없다!! -->
</foo>
혼합 내용
<!ELEMENT foo (#PCDATA | a_child_element | another_child)* >
- 일반 텍스트와 a_child_element, another_child 요소가 올 수 있다. 카디널리티 연산자로 *를 지정했기 때문에 순서 없이 올 수 있다.
- #PCDATA 키워드는 사용할 때마다 항상 내용 모델의 첫째 항목으로 나타나야 한다. 그리고나서 자식 요소 형 이름이 나와야 한다.
- HTML의 body 태그가 대표적인 혼합 내용 요소이다.
순차/선택 리스트 복합 사용
<!ELEMENT PersonName
(
(Mr | Ms | Dr | Rev), FirstName, MiddleName, LastName, (Jr | Sr | III)
)
>
카디널리티 연산자
- 카디널리티 연산자는 내용 모델에서 자식 요소들이 얼마나 많이 나타날 수 있는지를 정의한다.
카디널리티 연산자 | 설명 |
없슴 | 카디널리티 연산자가 없으면 자식 요소의 인스턴스가 단 한번, 필히! 나타남. |
? | 0번 또는 1번. 없거나 하나만 있거나. |
* | 0번 또는 여러번. |
+ | 1번 또는 여러번. |
속성(ATTRIBUTE) 선언
<!ATTLIST elementName
attrName1 attrType1 attrDefault1 defaultValue1
attrName2 attrType2 attrDefault2 defaultValue2
...
attrName3 attrType3 attrDefault3 defaultValue3
>
- elementName은 속성들을 포함하고 있는 요소의 이름이다.
- attrName은 속성의 이름이다.
- attrType은 속성의 형이다.
- attrDefaultN 은 속성이 반드시 필요한지 아닌지 여부.
속성의 디폴트 값
속성 디폴트 | 설명 |
#REQUIRED | 속성은 요소의 모든 인스턴스에 반드시 나타나야 한다. |
#IMPLIED | 속성은 선택적이다. 있어도 좋고 없어도 좋고.. |
#FIXED(디폴트값과 함께 사용) | 속성은 선택적이다. 만약 속성이 사용되면 반드시 디폴트값과 일치해야한다. 속성이 없어도 파서가 디폴트 값을 제공해 줄 수 있다. |
디폴트값(키워드 없이 사용) | 속성은 선택적이다. 속성이 사용되면 그 값을 따르고, 속성이 사용되지 않으면 파서가 디폴트 값을 제공해 줄 수 있다. |
REQUIRED
<!ATTLIST AnElement its_attr CDATA #REQUIRED >
<AnElement its_atr="haha"/>
IMPLIED
<!ATTLIST AnElement ist_attr CDATA #IMPLIDE >
- its_attr 속성은 선택적이다.
- #IMPLIED에서는 디폴트 값 지정을 불허한다.
FIXED
- 속성의 값을 특정값으로 고정시킨다.
<!ELEMENT Doc (#PCDATA) >
<!ATTLIST Doc version CDATA #FIXED "1.00">
- Doc 요소에 version 속성이 있건 없건간에 무조건 "1.00"의 version 속성이 있다고 간주한다.
- 만약 version 속성에 "1.00"이외의 값이 들어가면 유효하지 않은 XML 문서이다.
<Doc version="1.00">haha</Doc>
혹은..
<Doc>haha</Doc>
- version 속성의 값을 하나의 값으로 제한하면서 모든 요소의 모든 인스턴스에서 사용되지 않아도 되게 하려면 #IMPLIED 키워드를 가진 열거 속성형을 사용하면 된다.
<!ELEMENT Doc (#PCDATA) >
<!ATTLIST Doc version (1.00) #IMPLIED >
속성 형(Type)
10가지 형이 있다.
CDATA(문자 데이터)
열거형
- 지정된 텍스트 문자열 중의 하나만을 속성 값으로 사용한다.
<!ELEMENT PersonName (FirstName, MiddleName, LastName) >
<!ATTLIST PersonName
title (Mr | Ms | Dr | Rev) #IMPLIED
suffix (Jr | Sr | III) #IMPLIED
>
- 실 사용예
<PersonName title="Mr" suffix="Jr">
<FirstName>John</FirstName>
<MiddleName>Q</MiddleName>
<LastName>Public</LastName>
</PersonName>
ID 속성 형(요소 식별자)
<!ELEMENT Person (PersonName, CorpName?, Email*, Address?, Biography?) >
<!ATTLIST Person perID ID #REQUIRED >
- ID 형을 사용하는 속성은 요소의 인스턴스에서 유일하게 식별할 수 있는 이름을 제공한다.
ID 속성값은 XML 이름 규칙에 따라야 하고, 그 값은 사용하는 문서에서 유일해야 한다.
- 값은 숫자로 시작할 수 없다. 문자 + 숫자 형은 가능하다.
- 각 요소 형에서 ID는 단 한 개만 사용할 수 있다.
- 이 형의 모든 속성은 #IMPLIED 혹은 #REQUIRED로 선언해야 한다.
IDREF / IDREFS 속성 형 (요소 사이의 관계)
<!ELEMENT Book (#PCDATA) >
<!ATTLIST Book author IDREF #REQUIRED >
혹은, 한 책에 대한 저자가 여러명 일 수 있으므로
<!ATTLIST Book author IDREFS #REQUIRED >
- IDREF 속성 값은 적합한 XML 이름이어야 하고, 같은 문서 내의 ID 속성 값과 일치해야 한다.
- 동일한 ID에 대해 여러 IDREF 링크들이 허용된다.
- IDREFS는 한 속성에 여러 ID 값들을 공백으로 구분하여 가질 수 있다.
NMTOKEN, NMTOKENS 속성 형
<!ATTLIST PersonName
title NMTOKENS #IMPLIED
suffix NMTOKEN #IMPLIED
>
ENTITY/ENTITIES 속성 형
- ENTITY의 이름을 속성의 값으로 지정한다. 엔티티의 이름을 지정할 때 "&"와 ";"는 뺀다.
- ENTITIES는 공백으로 구분하여 여러개의 엔티티를 지정할 수 있다.
NOTATION 형
<!ATTLIST Product
ProductID ID #REQUIRED
hire (true | false) "false"
imgtype NOTATION (png | jpg | gif) #IMPLIED
imgsrc ENTITY #IMPLIED
>
- NOTATION 속성 값은 반드시 적절한 XML이름이어야 하고, 동일한 DTD내의 <!NOTATION> 선언과 일치해야 한다.
- 각 요소 형에 대해 NOTAION 속성 하나가 존재할 수 있다.
- 이 속성 형은 EMPTY 요소와 함께 사용 될 수 없다.
Notation : 비 XML 데이터
일반 엔티티(ENTITY)
매개 변수 엔티티
<!ENTITY % name "대체문자열" >
독립 문서 선언
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
- standalone 속성을 통해 XML 프로세서가 DOCTYPE 선언을 해석하는 방법 제공.
- yes : 문서는 자체에 포함되어 있으며 다른 데이터를 요구하지 않는다.
- no : 문서는 외부 DTD에 포함된 마크업을 사용한다.
DTD의 제약
- 비 XML 구문이다.
- DTD는 확장할 수 없다.
- 오직 하나의 DTD만이 문서와 결합할 수 있다.
- DTD는 XML 네임스페이스를 잘 지원하지 않는다.
- 매우 약한 데이터 형을 사용한다.
- 객체 지향 형의 개체 상속을 하지 못한다.
- 내부 서브셋을 사용하여 외부 서브셋을 무시할 수 있다.
- DOM을 지원하지 않는다.
- 상대적으로 오래되었다.
|