본문 바로가기
[ Web ]/Xml

XML과 DTD문서 만들기 (초보자를 위한 설명)

by 관이119 2012. 9. 12.
사랑+이별=추억 | 소심비형
http://blog.naver.com/ngmaster/120039607909

우선 간단하게나마 기본적인 설명을 읽으시고 가시면 좋겠습니다^^

DTD란?

DTD는 Document Type Definition의 약자로, 문서의 형태를 정의하는 것을 말합니다. DTD는 XML 문서의 구조를 명시적으로 선언하는 역할을 하며, XML 문서가 잘 만들어진 유효한 문서인지를 확인하기 위해 사용하는 문서입니다. 따라서 DTD를 사용하여 요소와 요소의 내용, 속성과 속성의 내용 그리고 요소의 순서나 반복성 등을 미리 정해놓고 XML 문서를 작성하는 것입니다. 이렇게 되면 XML문서를 작성하는 경우에 잘못된 문서를 작성하는 실수를 줄 일수 있습니다.

1. 엘리먼트 선언
<!ELEMENT 엘리먼트명 컨텐츠유형>

컨턴츠유형은 엘리먼트의 자료형이라고 보면 됩니다.
- 컨텐츠 유형 (시작태그 ~ 끝태그 사이)
a. #PCDATA
b. 자식엘리먼트 리스트
c. EMPTY
d. MIXED
e. ANY
- 컨텐츠 유형에 따라 엘리먼트 선언 형태가 달라집니다.


2. #PCDATA
<!ELEMENT 엘리먼트명(#PCDATA)>


3. 자식엘리먼트 리스트
- <!ELEMENT 엘리먼트명(자식엘리먼트1, 자식엘리먼트2...)>
- 리스트연산자(,), 선택연산자(|), 사용빈도 연산자(?, +, *, 없음)
- 연산자를 사용하지 않으면 기본값으로 1번만 사용할 수 있습니다.

4. EMPTY
<!ELEMENT 엘리먼트명 EMPTY>


5. MIXED
<!ELEMENT 엘리먼트명 (#PCDATA|자식1|자식2)*>


6. ANY

사용을 안합니다. 왜 DTD를 사용 하는지를 생각해 본다면 이유를 알게 됩니다.
DTD는 XML 문서가 규칙을 제대로 따르는 문서인지 유효성 검사를 하는데, ANY는 이러한 규칙을 무시하기 때문입니다.

문서를 만드는 입장에서는 편하겠지만 읽어 들이는 프로그래머 입장에서는 힘들겠죠?

<!ELEMENT 엘리먼트명 ANY>

7. 속성선언 : 반드시 엘리먼트명 뒤에 와야 하며, 독립적으로 사용이 불가능합니다.
<!ATTLIST 엘리먼트명

속성명1 속성유형 디폴트선언

속성명2 속성유형 디폴트선언

...>

8. 디폴트 선언
a. #IMPLIED : 속성 생략 가능

b. #REQUIRED : 속성 필수

c. #FIXED : 지정된 값만 사용

d. 디폴트값 : 생략하면 사용되는 기본값

9. #IMPLIED
<!ATTLIST 엘리먼트명 속성명 속성유형 #IMPLIED>

10. #REQUIRED
<!ATTLIST 엘리먼트명 속성명 속성유형 #REQUIRED>

11. #FIXED
<!ATTLIST 엘리먼트명 속성명 속성유형 #FIXED "고정값">

12. 디폴트값
<!ATTLIST 엘리먼트명 속성명 속성유형 "디폴트값">

13. 속성유형
a. CDATA : 문자 데이터

b. ENUMERATION : 열거형 ( a | b | c .... )

c. ID : 고유한 값을 가집니다. 같은 값을 가지면 ERROR

d. IDREF : 아이디 참조 잘 사용을 안합니다.

현재 문서에 존재하는 ID값중 하나를 사용.

IDREFS : 한 개 이상의 아이디 참조하며, 콤마가 아닌 공백으로 구분합니다.

e. NOTATION : 잘 사용을 안합니다.

f. ENTITY : 잘 사용을 안합니다.

14. 엔티티 - 문서를 구성하는 물리적인 저장 단위

a. 도큐먼트 엔티티 : 특별히 작업 안함

b. 외부 DTD 서브셋 엔티티 : 특별히 작업 안함

c. 빌트인(Bulit-in) 엔티티 : 미리 만들어진 엔티티 (&lt; &gt; &quot; &apos; &amp;)

d. 내부 일반 파스드 엔티티 : XML 작업이 편하도록 사용 (&kr; > "대한민국")

e. 외부 일반 파스드 엔티티 : XML 작업이 편하도록 사용 (&kind > 문서전체)

f. 외부 일반 인파스드 엔티티 : XML 작업이 편하도록 사용

g. 내부 파라미터 엔티티

h. 내부 파라미터 엔티티

- 엔티티의 용도 : 재사용성

- 물리적인 저장 유무

i. 내부(DTD내에 존재)

ii. 외부(파일 형태로 존재)

- 사용 장소

i. 일반(XML 문서내에서..)

ii. 파라미터(DTD 내에서..)

- 문자 데이터

i. 파스드(파서가 해석)

ii. 언파스드(파서가 비해석)

15. 노테이션
- 그림파일, 동영상, 음악파일 등을 식별하기 위한 요소

- 만든 자료타입 : <!NOTATION 노테이션명 SYSTEM "SYSTEM 식별자">

- 공용 자료타입 : <!NOTATION 노테이션명 PUBLIC "PUBLIC 식별자" "SYSTEM 식별자">

DTD 연산자
1. DTD 파일의 구조

<!ELEMENT booklist (book)>
<!ELEMENT book (title, author+, price*, publisher?)>


book의 자식은 무조건 첫번째로 title이 와야하고 그 다음 author가 와야 합니다.

선택 연산자
book의 자식에 선택 연산자(|)를 썼다면 title 이나 author 중 하나만 사용해야 합니다.

+ 연산자
생략할 수 없으나 최소 1회이며 무한대로 중복이 되도 상관이 없습니다.

? 연산자
안쓰거나 쓰더라도 한번만 사용해야 합니다.

* 연산자
가장 넓은 범위이며, 생략을 해도 되고 무한대로 사용 가능합니다.

괄호 ( )
괄호로 묶은 다음 연산자를 붙여서 한번에 여러개의 자식에게 연산자를 적용.
(author|price)? : author나 price
둘중에 하나만 사용 하든지 안하든지 한번만 할 수 있습니다.
<author|price)+ : author나 price
둘중에 하나는 사용하며 여러번도 가능합니다.
<author,price)+ : author가 나오고 price가 꼭 한번씩 나와야 합니다.

근데 또 한번 쓰고 싶다면 다시 author 나오고 price 가 나오는 형태가 되어야 합니다.

2. XML 문서에서 DTD 파일을 참조

Altova XMLSpy를 실행시킨 후 File > New를 클릭 > 아래 그림처럼 dtd 문서를 선택

아래의 내용을 넣어 줍니다.

<?xml version="1.0" encoding="EUC-KR"?>
<!ELEMENT ENTER_NAME_OF_ROOT_ELEMENT_HERE EMPTY>
<!ELEMENT booklist (book)>
<!ELEMENT book (title,author+, price*, publisher?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>

아래의 그림처럼 유효성 검사를 클릭합니다.

하단에 Valid라고 나오면 유효한 DTD문서라는 뜻입니다.

File > Save를 클릭 newDTD.dtd로 저장합니다.

다시 File > New를 클릭하여 아래 그림처럼 새로운 XML문서를 엽니다.

연결한 DTD를 선택해야 합니다.

우리가 만들어준 DTD문서의 root는 booklist입니다. (자동으로 선택되어 집니다.)

아래의 내용을 넣어 줍니다.

<?xml version="1.0" encoding="EUC-KR"?>
<!DOCTYPE booklist SYSTEM "newDTD.dtd">

<booklist>
<book>
<title>C#</title>
<author>홍길동</author>
<author>마징가</author>
<author>배트맨</author>
<price>20,000</price>
<publisher>ngmaster.com</publisher>
</book>
</booklist>

아래의 그림처럼 well-formed버튼을 눌러서 DTD 구조에 맞게 작성 했는지 검사합니다.

하단에 유효한 XML문서라며 well-formed 메세지를 보여주는군요^^

하단에 Text Grid... 끝에 Browser을 클릭해서 확인해 봅시다.

기본적인 DTD와 XML에 대해서 알아 보았습니다.
항상 친절한 설명이 되도록 노력은 하지만...-_-;;

'[ Web ] > Xml' 카테고리의 다른 글

xml에서의 기본 개념 10가지  (0) 2012.09.12

댓글