[XML응용]DTD를 이용하여 XML 문서 작성하기

류명운

·

2015. 10. 5. 11:00

반응형


DTD란?

 - DTD(Document Type Definition)는 다른 마크업 언어를 정의하기 위한 문법이라 할 수 있다. 여기서 마크업 언어란 문서 구조를 구성하는 앨리멘트들 즉, 앨리멘트와 속성, 엔티티의 규칙을 정의하는 언어를 말한다. 그래서 사람들은 DTD를 XML 문서의 설계도에 비유하기도 하며, XML 모델링 언어 또는 스키마(Schema)라 부르기도 한다.

 - 잘 구성된 문서(Well-Formed Documnet)와 유효한 문서(Valid Documnet)는 차이가 있다.

 - Well-Formed Document: XML 문서의 구조를 나타내는 DTD를 가지고 있지 않고 최소한의 XML의 문법적 규약에 따라 문서를 작성하기만 하면 된다.

 - Valid Document: 반드시 DTD를 포함하고 있어야 한다. 즉 DTD에 정의된 규칙에 따라 XML 문서를 작성해야 하며 유효성(validation)이 검증되어야 한다.

 - 유효성 검사: DTD에 정의된 규칙대로 XML 문서가 작성되었는지 유효성 검증을 위하여 XML 파서를 이용한다.

 

내부 DTD 서브셋

 1. 내부 DTD 서브셋 작성 위치

  - 마크업 언어에 대한 정의가 XML 문서 내부에서 작성되는 것을 내부 DTD 서브셋이라 한다.

  - 일반적으로 새로운 마크업 언어를 개발하기 위해서 내부 DTD 서브셋을 작성하지는 않는다.

  - 내부 DTD 서브셋은 주로 외부 DTD 서브셋의 일부 내용을 재정의해서 XML 문서에 적용할 목적으로 이용된다.

 

 2. 내부 DTD 서브셋 구성 요소

  - 앨리멘트(Element) 선언

  - 속성(Attlist) 선언

  - 엔티티(Entity) 선언

  - 노테이션(Notation) 선언

  - 프로세싱 인스트럭션(Processing Instruction)

  - 파라미터 엔티티 참조(Parameter Entity Reference)

  - 주석(Comment)

  - 공백(Space)

  - 컨디셔널 섹션(Conditional Section)

 

 3. 내부 DTD 서브셋 작성 예

 <?xml version="1.0" encoding="euc-kr"?>

 <!DOCTYPE 책목록 [

  <!ELEMENT 책목록 (책제목, 내용)>

   <!ELEMENT 책제목 (저자, 제목)>

    <!ELEMENT 저자 (#PCDATA)>

    <!ELEMENT 제목 (#PCDATA)>

   <!ELEMENT 내용 (#PCDATA)>

 ]>

 <책목록>

  <책제목>

    <저자>류명운</저자>

    <제목>명우니닷컴 문서</제목>

  </책제목>

  <내용>hello, Myeonguni world</내용>

 </책목록>

 

외부 DTD 서브셋

 xml 문서 중에서 DTD 정의를 외부의 별도 파일로 저장하여 사용하는 것을 뜻하며, 일반적으로 DTD 문서라고 부르는 것은 외부 DTD 서브셋을 의미한다.


 1. 외부  DTD 서브셋 구성 요소

  - 텍스트(Text) 선언

  - 앨리멘트(Element) 선언

  - 속성(Attlist) 선언

  - 엔티티(Entity) 선언

  - 노테이션(Notation) 선언

  - 프로세싱 엔티티 참조(Parameter Entity Reference)

  - 주석(Comment)

  - 공백(Space)

  - 컨디셔널 섹션(Conditional Section)


 2. 외부 DTD 서브셋 작성 간단한 예

 dtd-test.dtd

 <?xml version="1.0" encoding="euc-kr"?>


 <!ELEMENT 책목록 (책제목, 내용)>

  <!ELEMENT 책제목 (저자, 제목)>

   <!ELEMENT 저자 (#PCDATA)>

   <!ELEMENT 제목 (#PCDATA)>

  <!ELEMENT 내용 (#PCDATA)>


test.xml

 <?xml version="1.0" encoding="euc-kr"?>

 <!DOCTYPE 책목록 SYSTEM "dtd-test.dtd">

 <책목록>

  <책제목>

   <저자>류명운</저자>

   <제목>명우니닷컴 문서</제목>

  </책제목>

  <내용>hello, Myeonguni world</내용>

 </책목록>

 

 3. (실습) 다음 메일의 내용을 외부 DTD 문서 'ex3-1-2.dtd'로 구성된 XML 문서로 작성하고 'ex3-1-2.xml'로 저장하여 보자.

 REPLY-TO: "김형근" gudrmsglgl@naver.com

 FROM: "류명운" redkan@naver.com

 TO: "test@daum.net"

 CC: "test@google.com"

 SUBJECT: 뭐하냐

 DATE: Tues, 6 Oct 2015 09:22:00 +0900

 ORGANIZATION: 명우니컴퍼니

 MIME-VERSION: 1.0

 CONTENT-TYPE: text/plain; charset="euc-kr"

 CONTENT-TRANSFER-ENCODING: 8bit


 4. #PCDATA

 PCDATA라는 것은 Parsed Character DATA의 약자로 그 앨리멘트가 파싱된(parsed) 문자 데이터를 사용한다는 것을 파서에게 알리는 역할을 한다. 즉, 단순한 문자 데이터를 의미한다.

  '#' 기호는 PCDATA가 일반적인 의미의 앨리멘트가 아니라는 것을 나타내기 위해서 붙이는 것으로, 예약된 이름 지시자(reserved name indicator)이다. '#PCDATA'는 시작과 종료 태그 안에 포함되어 있는 내용과 연결되어 있으며, 유효하지 않는 문자는 대체문자를 사용하지 않으면 오류가 발생한다해야 한다.


 5. EMPTY

 앨리멘트의 내용을 포함하지 않을 때 EMPTY 단어를 사용하며 XML 문서를 나타낼 때는 빈 앨리멘트로 나타내며, 내용을 나타내면 파서 에러가 나타난다.

 EMPTY앨리멘트를 문서에서 사용할 때는 굳이 시작/종료 태그를 쌍으로 나타낼 필요 없이 슬래시를 이용한 약식 표기법으로 사용할 수 있다

ex) <!ELEMENT 비고 EMPTY>   ->   <비고/>


 6. ANY

 ANY는 어떠한 종류의 내용도 허용한다는 뜻으로, EMPTY와 마찬가지로 ANY도 괄호나 예약된 이름 지시자를 넣지 않고, 어떤 앨리멘트의 형태든지 허용한다.

 모든 앨리멘트가 특정한 앨리멘트의 하위 앨리멘트가 될 수 있다는 것을 의미하며, 주로 새로운 DTD를 작성할 때 문서의 특정 부분에 문장을 추가할 때 사용한다.


 7. 앨리멘트 선언 문법

 앨리멘트를 선언할 경우 앨리멘트의 내용을 정의하면 하위의 자손 앨리멘트들을 포함할 수 있으며, 앨리멘트의 순서 또는 표현 횟수를 정의할 수 있다.

기호 

기호타입

설명 

예제 

예제 설명 

세로막대

or조건

A|B

A와 B중 하나만 반드시 나타남

,

쉼표 

명시된 순서대로 나타남 

A,B 

A가 나타난 다음에 뒤에 B가 나타남

?

물음표 

안 나타나거나 한번은 나타날 수 있음 

A? 

A가 나타나지 않거나 나타날 수 있음 

 

기호 없음 

반드시 한번 나타남 

A가 반드시 나타남 

별표 

안 나타날 수도 있고 여러 번 나타날 수도 있음 

A*

A가 없을 수도 있고 여러 번 나타날 수 있음 

덧셈 

최소 1번 이상 나타남 

A+ 

A가 반드시 있어야 하고 여러 번 나타날 수 있음

()

괄호

 그룹 앨리멘트

 (A|B), C

 A나 B 중 하나가 반드시 나타나야하고 그 뒤에 C가 나온다


 8. 혼합 지정의 예

 <!ELEMENT 명세 (#PCDATA | 코드)*>

 

 <명세>

  이것은 코드 리스트입니다

  <코드>1111</코드>

  <코드>2222</코드>

  <코드>3333</코드>

 </명세>



9. DTD 실습 1 (실습이 중요함..real)

 exDTD-1.xml

 <?xml version="1.0" encoding="euc-kr"?>

 <!DOCTYPE memo SYSTEM "exDTD-1.dtd"> 

 <memo>

  <to>김형근</to>

  <comment>고생해라</comment>

  <comment>사요나라</comment>

  <from>류명운</from>

 </memo>

 exDTD-1.dtd

 <?xml version="1.0" encoding="euc-kr"?>

 <!ELEMENT memo (to, comment+, etc?, from)>

  <!ELEMENT to (#PCDATA)>

  <!ELEMENT comment(#PCDATA)>

  <!ELEMENT etc(#PCDATA)>

  <!ELEMENT from(#PCDATA)>


DTD 유효성 검사

 XML 문서가 해당 DTD 문서에 정의되어 있는 구조에 맞게 작성되었는지 검사하는 것을 유효성 검사라고 한다.

 Well-Formed 문서는 웹브라우저를 이용하여 곧바로 검증을 할 수 있어서 Well-Formed 문서를 만족하면 계층 구조의 내용을 나타내고, 그렇지 않으면 오류를 발생하여 준다.

 DTD가 포함된 Valid 문서는 웹브라우저로는 검증할 수 업으므로 인터넷에서 검증 파서기(iexmltls.exe)를 다운받아 검증해야 한다. 이 프로그램을 벨리데이터(Validator)라고 부른다.


Attribute의 선언

 XML 문서가 해당 DTD 문서에 정의되어 있는 구조에 맞게 작성되었는지 검사하는 것을 유효성 검사라고 한다.


 1. 속성 리스트 선언의 목적
  - 주어진 앨리멘트 유형(element type)에 속하는 속성들의 집합을 정의한다
  - 이러한 속성들의 유형을 제한한다
  - 속성들의 기본값(default value)을 제공한다

 2. 속성 리스트 선언 방법 : <!ATTLIST 앨리멘트명, 속성명, 속형타입, 기본값>
  - 앨리멘트 명(element-name): 속성이 속한 앨리멘트의 형
  - 속성명(attribute-name): 실제 속성이 갖는 이름
  - 속성타입(attribute-type): 속성이 갖는 타입
  - 기본값(default): 속성의 존재 여부를 나타내기 위한 항목으로 초기값, #IMPLIED, #REQUIRED, #FIXED가 있다.

 초기값

 앨리멘트에 속성이 생략되면, 속성의 초기 값이 파서에 의해 적용되고, 정해진 값 이외의 값을 설정할 수 있다

 #FIXED

 속성값이 고정되어 있으며 앨리멘트 내에서 다른 속성 값으로 설정할 수 없다.

 #IMPLIED

 속성은 앨리멘트 내에서 생략이 가능하며, 만약 속성을 선언할 경우 기본값을 지정하면 파서 에러가 나타난다

 #REQUIRED

 속성은 앨리멘트 내에서 생략이 불가능하며, #REQUIRED로 선언된 속성 값을 미리 설정할 수 없다


 3. [실습] 다음의 XML 문서를 '#FIXED' '#REQUIRED' 속성 실습으로 파일로 저장하고, 웹브라우저로 나타내보자

'dtd-test.dtd'

<?xml version="1.0" encoding="euc-kr" standalone="yes"?>

<!DOCTYPE booklist (book*)>

 <!DOCTYPE book (title, author+)>

 <!DOCTYPE title (#PCDATA)>

 <!DOCTYPE author (#PCDATA)>


<!ATTLIST book kind CDATA #REQUIRED nation CDATA #PIXED "국내">


'xml-test.xml'

<?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE booklist SYSTEM "dtd-test.dtd">


<booklist>

 <book kind="소설" nation="대한민국">

 <title>명운과형근</title>

 <author>명운이</author>

 </book>


 <book>

 <title>형근과명운</title>

 <author>형근이</author>

 </book>

</booklist>


 4. 속성의 유형(type) 선언

 속성의 유형은 선언된 속성의 유형을 의미하며, 속성타입에는 문자열 유형, 토근화 유형, 열거형 유형이 있다.

 문자열 유형

 속성중에서 가장 일반적인 형태로 문자 데이터만 포함한다

 'CDATA' 문을 사용하여 유형을 선언한다 

 

 ex) <!ATTLIST 책 group CDATA "computer" code CDATA #REQUIRED>

 ->책 앨리멘트의 group 속성은 'CDATA'유형이며, 값이 지정되지 않으면 기본 그룹값으로 'computer'가 지정되며, 'code'의 속성은 반드시 값이 지정되어야 한다

 토큰화 유형

 키워드를 사용하여 속성 값을 제한하여 사용할 수 있다

 특별한 의미를 갖는 문자로 여러 가지 방법으로 나타낼 수 있다.

 열거형 유형

 문자열 목록에서 한 가지를 선택하는 것으로 '|' 연산자를 사용하여 선택값을 나열하고 그 값들 주에서 하나를 적용하는 것이다


 5. (속성 타입)토큰화 유형

 ID

 유일한 문자를 의미하며 앨리멘트를 구분한다

 <!ATTLIST 요소이름 속성이름 ID 속성기본값>

 * ID 유형의 속성 값에는 처음으로 숫자 값이 나타나면 안 됨

 IDREF

 문서안에 선언된 ID를 참조한다

 <!ATTLIST 요소이름 속성이름 IDREF 속성기본값>

 * ID Reference로 ID를 참조하는 것으로, 속성 값은 ID 유형으로 선언된 속성 값이어야 한다

 * 속성기본값은 #IMPLIED #REQUIRED만 사용가능

 IDREFS

 공백으로 분리된 여러 ID를 참조한다

 <!ATTLIST 요소이름 속성이름 IDREFS 속성기본값>

 * 속성기본값은 #IMPLIED #REQUIRED만 사용가능

 ENTITY

 ENTiTY는 개체가 정의된 장소에 따라 내부와 외부 개체로 구분되며, 외부 개체는 외부의 여러 가지 개체를 참조한다는 것을 의미한다.

 NMTOKEN

 사용문자가 알파벳, 숫자 마침표 하이픈을 의미한다

 <!ATTLIST 요소이름 속성이름 NMTOKEN 속성기본값>

 * 속성기본값은 #IMPLIED #REQUIRED만 사용가능

 NMTOKENS

 공백으로 분리된 값들을 허용한다

 <!ATTLIST 요소이름 속성이름 NMTOKENS 속성기본값>




















 6. ENTITY (개체 정의)

 개체 정의 형식 : <!ENTITY 개체이름 내용>

 개체 참조 형식 : &개체이름;

 개체 정의 예: <!ENTITY 명우니닷컴주소 "http://myeonguni.tistory.com">

 개체 사용 예 : &명우니닷컴주소;


 7. ENTITY 개체 구조

 




연습문제


Q1. 유효한 XML 문서란 무엇이며, DTD(Document Type Definition)의 역할에 대해서 설명하시오.


Q2. 유효한 XML 문서의 장점에 대해서 기술하시오.


Q3. DTD 내부에 선언될 수 있는 마크업들은 어떠한 것들이 있는지 기술하시오.


Q4. (실습)다음은 음악 파일의 정보를 표현하기 위한 앨리멘트들이다.


 앨리멘트 이름

 설명

 데이터 형식

 Filename

 파일이름

 #PCDATA

 Title

 제목

 #PCDATA

 Artist

 가수

 #PCDATA

 Album

 앨범

 #PCDATA

 Track

 트랙 번호

 #PCDATA

 Genre

 장르

 #PCDATA

 Year

 연도

 #PCDATA

 Comments

 설명

 #PCDATA


그리고 이들 앨리멘트들은 다음과 같은 규칙을 갖는다고 하자.

 - 루트 앨리멘트의 이름은 MusicInfo이며, 그 하위에는 Filename, Title, Artist, Album, Track, Genre, Year, Comments의 자식 앨리멘트들이 순서대로 나타난다.

 - 모든 자식 앨리멘트들이 한 번씩 사용되어야 한다.

 - 자식 앨리멘트의 내용은 모두 문자 데이터로 구성된다.


 (1) 위의 규칙을 따르는 앨리멘트들을 내부 DTD에 선언하시오

 (2) DTD의 규칙을 따르는 XML 문서를 작성하시오

 (3) 작성된 XML 문서의 유효성을 검증하시오. 만약 오류가 있다면 올바르게 수정하시오

 (4) DTD가 여러 개의 음악 파일 정보들을 표현할 수 있도록 위에서 작성된 내부 DTD의 정보를 수정하라. 그리고 이 DTD의 규칙을 따르도록 XML 문서를 수정하시오.

   - 루트 앨리멘트는 하나 이상의 MFILE이라는 앨리멘트를 가진다.

   - MFILE 앨리멘트는 Filename, Title, Artist, Album, Track, Genre, Year, Comments의 자식 앨리멘트를 가진다.

   - 자식 앨리멘트의 사용 방법은 위에서 제시된 DTD 규칙과 동일하다.

 (5) 위에서 작성된 내부 DTD를 외부 DTD로 만들고 XML 문서에서 외부 DTD를 사용할 수 있도록 외부 DTD에 대한 선언을 하시오. 그리고 (3)의 과정을 반복하여 처리하시오.


Q5. (실습)다음은 간단한 도서 주문관리 시스템을 구축하기 위한 정보 분석의 내용이다. 시스템을 구축하기 위한 정보 분석의 내용이다. 시스템은 다음과 같이 세 가지로 구분되는 정보를 갖는다.

 - 도서DB: 책의 전체 목록을 나타내니 위해 book_db라는 앨리멘트를 사용한다. 그리고 이 앨리멘트는 각 도서를 구분할 수 있도록 book 앨리멘트를 가진다. book 앨리멘트는 고유의 식별 번호(bk_id)를 속성으로 가진다. book 앨리멘트는 최소 한번이상 나타나야 한다. book 앨리멘트 내에는 title, author, price, publisher, ISBN의 자식 앨리멘트들이 순서대로 한 번씩 나타난다.


 - 주문자가 구매한 구입품목을 나타내기 위해 purchase_item 앨리멘트를 사용한다. 그리고 purchase_item 앨리멘트는 주문번호를 나타내는 order_no 속성을 가진다. 이 order_no 속성은 유일한 식별번호를 갖는다. purchase_item 하위에는 각 주문내역을 구분하기 위한 item 앨리멘트를 가진다. item 앨리멘트는 도서 DB의 book 식별번호를 참조하는 bk_id와 배송상태, 구입수량을 나타내는 shipping 및 quantity의 속성을 가진다. purchase_item는 최소 0번 이상 나타날 수 있다.


 - 날짜별 주문내역의 정보를 나타내기 위하여 order_list 앨리멘트를 사용한다. 이 앨리멘트는 날짜 정보를 나타내는 date 속성을 사용한다. order_list의 하위에는 각 주문내역의 목록을 나타내는 olist 앨리멘트들이 나타난다. olist 앨리멘트는 구입품목의 주문번호를 참조하는 order_no 값을 가진다. order_list 앨리멘트는 최소 한번 이상 나타날 수 있다.

반응형