상세 컨텐츠

본문 제목

[정보표준화론] 5. DTD

수업노트

by ∫2tdt=t²+c 2016. 6. 9. 00:11

본문

DTD(Document Type Definition)

XML로 특정 데이터를 작성시 공통된 양식을 강제하여 추후에 통합하여 의미를 부여하고 자동화처리가 가능하도록 하기 위해 데이터 양식을 정의해야함. 이를 위해 DTD나 XML Schema를 사용하여 XML문서의 구조를 정의.

한계

  • DTD 자체는 Well-formed XML 문법을 사용하지 않기에, DOM을 통합 접근이 불가능
  • XML문서는 오직 하나의 DTD만 선언가능. 즉 복수의 DTD를 조합하여 사용하는 것이 불가능
  • 리터럴 데이터를 검증하는 방법을 제공하지 않음.
  • 확장성이 없음. 다양한 새 데이터 타입을 추가할수 없고, 재사용이 불가능하므로 기존의 DTD를 확장하려면 DTD를 새로 작성해야한다.
  • Namespace를 지원하지 않음
  • 정적인 선언만 지원됨. 동적 선언 불가
  • 상속 불가. 상속을 통한 확장, 재사용이 전혀 불가능
위 같은 한계를 극복하기 위해 XML Schema가 표준으로 제시되었고, 이는 DTD보다 강력한 구조/데이터 기술을 제공한다.

선언 방법

  • 외부 DTD: 외부의 DTD파일을 XML문서에서 가져와서 사용하는 것
  • 내부 DTD: XML 문서 내부에 DTD를 직접 선언하는 것
  • 외부/내부 혼합: 외부DTD와 내부DTD를 동시에 사용하는것. 이때 내부 DTD가 외부 DTD를 오버라이드한다.

외부 DTD 선언

<!DOCTYPE DTD이름 SYSTEM "DTD파일 경로">

<!DOCTYPE DTD이름 PUBLIC "DTD고유 식별자" ["DTD파일 경로"] >

DTD이름은 XM문서의 루트요소 이름이 된다.

SYSTEM 선언의 경우 시스템 내부에 존재하는 파일 경로나 URL을 지정.

PUBLIC 선언의 경우 DTD고유 식별자를 제시하여 공인된 외부 DTD를 선언하며, 이를 가져오는게 실패할 경우를 대비하여 뒤에 DTD파일 경로를 추가로 선언할 수 있음.


내부 DTD 선언

<!DOCTYPE DTD이름 [

 ...DTD 내용...

]>

XML 문서 내부에 DTD를 정의하므로, 다른 XML문서와 DTD공유가 불가능함. 유용하지 못한 방법.


구성요소

1. Element

요소를 선언하고, 요소가 어떤 하위 요소를 가질 수 있는지 정의.

<!ELEMENT 요소이름 (하위요소 목록)>

요소이름: 선언할 요소의 이름

하위요소 목록: 해당 요소가 가질수 있는 하위요소를 정의. 다음과 같은 값을 조합하여 사용가능

  • #PCDATA: 리터럴 문자 데이터가 올수 있음
  • 하위요소이름: 해당 이름의 하위 요소가 올 수 있음
  • EMPTY: 아무값도 올 수 없음
  • ANY: 모든 값(리터럴 및 아무 요소)이 다 올수 있음. 이를 사용하면 문서 간의 호환성을 높일 순 있지만, 아무것이나 다 허용하기 때문에 양식을 강제하는 효과가 없어 Validity를 저해할 수 있음.
  • 수량자(? * +): 하위요소이름 및 괄호와 결합하여 사용가능하여, 해당 하위요소의 반복 가능횟수를 제한함
  • 결합자(,sequence, | choice): A,B,C의 경우 A, B, C요소가 제시된 순서대로 등장해야함. A|B|C의 경우 A, B, C 중 하나만 등장하면 됨.
    #PCDATA하위요소이름를 결합할 땐 반드시 choice를 사용해야하고 수량자 *을 붙여야함.
  • 괄호: 결합자 간 결합 우선 순위를 설정하기 위해 괄호를 사용가능. (A|B),C의 경우 A,C 또는 B,C가 등장해야함.

2. Attribute

선언된 요소가 어떤 속성을 가질 수 있는지, 그 속성은 어떤 속성값을 가질 수 있는지 정의.

<!ATTLIST 요소이름 (속성이름 속성타입 기본값선언)+>

요소이름: 속성을 정의할 요소의 이름

속성이름: 정의할 속성의 이름. 이름은 _ :로 시작가능. 숫자로 시작 불가능. 공백 사용 불가능. 같은 속성이름을 중복해서 선언시 뒤의 선언은 무시된다.

속성타입: 사용가능한 속성값을 제한하기 위한 타입. 다음과 같은 값이 사용가능.

  • CDATA: 텍스트 리터럴
  • ID: 문서 내 고유 식별자. 숫자로 시작불가능. 공백사용 불가. 해당 ID를 다른 요소에서 중복으로 사용불가.
  • IDREF: 다른 요소에서 지정한 ID를 참조. 주어진 값과 일치하는 ID값이 존재하야함.
  • IDREFS: 공백으로 구분하여 여러개의 IDREF을 사용가능.
  • NMTOKEN: 이름 토큰. ID와는 달리 숫자로 시작가능하며, 다른 요소에서 중복으로 사용가능.
  • NMTOKENS: 공백으로 구분하여 여러개의 NMTOKEN을 사용가능
  • ENTITY: DTD에서 선언된 Entity의 이름.
  • ENTITIES: 공백으로 구분하여 여러개의 ENTITY를 사용가능
  • NOTATION: DTD에서 선언된 Notation의 이름
  • (값1값2 | ... ): 값1, 값2 ...  중 하나의 값을 선택하여 사용가능. 값1, 값2에는 따옴표를 사용하지 않음.

기본값선언: 속성의 생략여부, 기본값을 정의함. 다음과 같은 값이 사용가능.

  • #REQUIRED: 해당속성 생략불가
  • #IMPLIED: 해당속성 생략가능
  • #FIXED "고정속성값": 해당속성은 오직 고정속성값만 가지거나, 아예 생략하거나 둘 중 하나만 가능.
  • "기본속성값": 해당속성을 생략시 기본속성값에 주어진 값을 가지는것으로 여김.

3. Entity

반복적으로 사용될수 있는 구를 선언하여, XML이나 DTD에서 재사용할 수 있도록 함. 재사용이 가능한 개체로써 XML조각, DTD조각, 긴 문자열, 상수, 비XML자료 등이 될 수 있음. 용법은 C언어의 #define과 유사.


General Entity: XML에서 참조하는 엔티티

<!ENTITY 엔티티이름 "문자열"> (내부 엔티티)

<!ENTITY 엔티티이름 SYSTEM "XML파일 경로"> (외부 엔티티)

엔티티이름: 선언할 엔티티의 이름

문자열: 해당 엔티티는 해석시 문자열에 해당하는 값으로 대체됨.

XML파일 경로: 해당 엔티티는 해석시 XML파일 경로에 해당하는 XML문서로 대체됨.

참조시 &엔티티이름; 의 형태로 사용.


내장 Entity (XML 내부에서 사용불가한 문자들을 표현하기 위해 사용됨.)

  • &lt; : <
  • &gt; : >
  • &quot; : "
  • &apos; : '
  • &amp; : &


Parameter Entity: DTD에서 참조하는 엔티티

<!ENTITY % 엔티티이름 "문자열"> (내부 엔티티)

<!ENTITY % 엔티티이름 SYSTEM "DTD파일 경로"> (외부 엔티티)

엔티티이름: 선언할 엔티티의 이름

문자열: 해당 엔티티는 해석시 문자열에 해당하는 값으로 대체됨.

DTD파일 경로: 해당 엔티티는 해석시 DTD파일 경로에 해당하는 DTD문서로 대체됨.

참조시 %엔티티이름; 의 형태로 사용.

4. Notation

Unparsed Entity나 비XML 자료를 다룰 때, 그 정보를 프로그램에 제공하기 위해 사용함.

<!NOTATION 이름 SYSTEM "시스템값">

<!NOTATION 이름 PUBLIC "형식ID" ["시스템값"]>

이름: 선언할 Notation의 이름. 이 이름은 NOTATION타입으로 지정된 속성에 의해 참조됨.

시스템값: 해당 Notation이 연결될 시스템 상의 링크

형식ID: 해당 Notation이 연결될 공인된 외부 포맷 ID. 이 ID를 확인못할 경우를 대비하여 뒤에 시스템값을 추가로 선언할 수 있음.




관련글 더보기

댓글 영역