전체 페이지뷰

2017년 3월 22일 수요일

XML - DTDs

Document Type Declaration(DTD)는 XML 문서를 정확하게 작성하는 한 방법입니다. DTD는 문법에 따라 문서에 사용된 어휘와 유효성을 검사합니다.
DTD는 문서 내부에 직접 들어갈 수도 있고 독립된 문서에 따로 둘 수도 있습니다.

Syntax

기본 문법은 다음과 같습니다.
<!DOCTYPE element DTD identifier
[
   declaration1
   declaration2
   ........
]>
cs


  • DTD는 <!DOCTYPE 으로 시작합니다.
  • element는 파서에게 문서를 특정 루트 dlement로부터 parse하라고 알려줍니다.
  • DTD identifier는 문서 타입 정의를 위한 식별자로서, 시스템의 파일 경로일 수도 있고 인터넷 상의 파일 URL일 수도 있습니다. DTD가 외부 경로를 가르키고 있는 경우 External subset이라고 부릅니다.
  • 대괄호 []에는 internal subset이라는 선택적 entity 목록 선언이 들어갑니다.

Internal DTD

XML 파일 내부에 element들이 선언되었다면 internal DTD라고 부릅니다. Internal DTD라고 부르려면 XML 선언부 내에 standalone이 yes로 설정되어야 합니다. 즉, 선언은 외부 소스와 독립적입니다.

Syntax

internal DTD의 문법은 다음과 같습니다.
<!DOCTYPE root-element [element-declarations]>
cs

root-element에는 root element 이름이 들어가야 하고,  element-declarations는 element를 선언하는 부분입니다.

Example

단순한 예를 따라가면서 살펴봅시다.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE address [
   <!ELEMENT address (name,company,phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT company (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>
<address>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</address>
cs

Start 선언 

아래 문장으로 XML선언이 시작됩니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
cs

DTD

XML 헤더 바로 다음에 document type 선언이 뒤따릅니다(보통 DOCTYPE 이라고 합니다).
<!DOCTYPE address [
cs

DOCTYPE 선언부 element이름 앞에는 느낌표(!)가 있습니다. DOCTYPE은 파서에게 이 문서가 DTD와 관련되어 있음을 알려줍니다.

DTD Body

뒤이어 Body 부가 나오게 되고, 여기에서 element, attribute, entity, notation을 선언합니다.
<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone_no (#PCDATA)>
cs

<name> 문서의 어휘(vocabulary)를 구성하는 몇가지 element가 선언되어 있습니다. <!ELEMENT name (#PCDATA)>는 element 이름을 "#PCDATA" 유형으로 정의합니다. 여기서 #PCDATA는 parse-able 텍스트 데이터를 의미합니다.

End Declaration

]> 기호와 함께 DTD가 닫히고, 이후에는 바로 XML문서가 뒤따릅니다.


Rules

  • DTD는 문서의 가장 앞부분에 위치합니다. 다만 XML 헤더는 DTD 앞에 위치합니다. 이 위치 외의 다른 곳에 와서는 안 됩니다.
  • DOCTYPE 선언, element 선언은 모두 느낌표(!)로 시작합니다.
  • DTD에서 이름은 root element의 type과 같아야 합니다.

External DTD

External DTD는 XML 파일의 외부에서 선언됩니다. 올바른 .dtd 파일 또는 유효한 URL인 system attribute을 지정하여 액세스할 수 있습니다. External DTD를 지정하기 위해서는 XML 선언부의 standalone attribute를 no로 설정해야 합니다. 즉, 선언부가 외부 소스에 대한 정보를 가지고 있다는 뜻입니다.

Syntax

<!DOCTYPE root-element SYSTEM "file-name">
cs
여기서 file-name은 dtd 확장자의 파일입니다.


Example

아래의 예는 외부 DTD의 사용법을 보여줍니다.
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE address SYSTEM "address.dtd">
<address>
  <name>Tanmay Patil</name>
  <company>TutorialsPoint</company>
  <phone>(011) 123-4567</phone>
</address>
cs

DTD 파일인 address.dtd의 내용은 다음과 같습니다.
<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
cs

Types

System identifier나 public identifier를 사용하여 외부 DTD를 참조할 수 있습니다.

System Identifier

DTD를 가지고 있는 외부 파일의 위치를 특정해 줍니다. 문법은 아래와 같습니다.
<!DOCTYPE name SYSTEM "address.dtd" [...]>
cs

보시다시피 SYSTEM이라는 키워드와 파일 위치를 나타내는 URI가 들어 있습니다.

Public identifier

아래에 나오는 것처럼 DTD 리소스에 접근하는 방법을 알려줍니다.
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">
cs

키워드 PUBLIC이 나오고 identifier가 뒤따릅니다. Public identifier는 catalog의 진입점을 알려주는 용도입니다. Public identifier는 어떤 포맷으로도 상관없지만, 일반적으로 가장 널리 사용하는 포맷은 Formal Public Identifiers(FPIs)입니다.

댓글 없음:

댓글 쓰기