이전 블로그(
http://blog.naver.com/nashira7 )에서 옮겨왔습니다.
작성일 : 2005년 7월 15일
옮긴일 : 2008년 12월 22일
지금까지 XML 문서 타입을 결정하는 DTD문서에 대해 살펴보았다.
정리하면 DTD는 XML 문서의 ELEMENT가 어떤 계층으로 되어 있고 그 엘리먼트가 포함하는 데이터 타입으로 어떤 것들이 올 수 있는지를 결정하는 것이었다.
그럼, 이제 속성이라는 것에 대해 살펴보고 선언하는 방법을 알아보도록 하겠다.
다음의 XML문서는 엘리먼트로만 이루어진 구조이다.
<BOOK>
<TITLE></TITLE>
</BOOK>
하지만 아래의 구조는 속성이 포함된 경우이다.
<BOOK Binging="1994" >
<TITLE></TITLE>
</BOOK>
1. 속성 리스트의 선언 형태
<!ATTRIBUTE Name AttDefs>
Name : 속성에 연결된 엘리먼트의 타입 이름
AttDefs : 하나 혹은 그 이상의 속성 정의(Attribute definition)
속성 정의 형태 : Name AttType DefaultDecl
(Name : 속성이름, AttType : 속성에 지정될 수 있는 값의 종류인 속성타입(attribute type)
DefaultDecl : 디폴트 선언)
예) FILM 이라는 엘리먼트를 선언
<!ELEMENT FILM (TITLE, (STAR | NARRATOR | INSTRUCTOR))>
다음으로 FILM 엘리먼트에 두 개의 속성을 선언(Class와 Year)
<!ATTLIST FILM Class CDATA "fictional" Year CDATA ##REQUIRED>
결과
<?xml version="1.0"?>
<!DOCTYPE FILM
[
<!ELEMENT FILM (TITLE, (STAR | NARRATOR | INSTRUCTOR))>
<!ATTRIBUTE FILM Class CDATA "fictional" Year CDATA ##REQUIRED>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT STAR (#PCDATA)>
<!ELEMENT NARRATOR (#PCDATA)>
<!ELEMENT INSTRUCTOR (#PCDATA)>
]
>
<FILM Year = "1984">
<TITLE>The morning After</TITLE>
<STAR>Morgen Attenbury</STAR>
2. 속성타입
1) 문자열 타입 - 따옴표로 둘러싸인 문자열로 지정
2) 토큰화된 타입 - 고유한 속성값이 선언되어야 한다. ID라는 키워드 사용
예1) ID
<?xml version="1.0"?>
<!DOCTYPE INVENTORY
[
<!ELEMENT INVENTORY (ITEM*)>
<!ELEMENT ITEM (#PCDATA)>
<!ATTLIST ITEM StockCode ID #REQUIRED>
]
>
<INVENTORY>
<ITEM StockCode = "S021" >Peach Tee Pot</ITEM>
<ITEM StockCode = "S034" >Electric Coffee Grinder</ITEM>
<ITEM StockCode = "S086" >Candy Thermometer</ITEM>
</INVENTORY>
예2) IDREF
<!ELEMENT ITEM (#PCDATA)>
<!ATTLIST ITEM StockCode ID #REQUIRED GoesWith IDREF #IMPLIED>
You could then use this attribute to refer to another ITEM element, as shown here:
<ITEM StockCode="S034">Electric Coffee Grinder</ITEM>
<ITEM StockCode="S047" GoesWith="S034" >Coffee Grinder Brush</ITEM>
예3) IDREFS
<ITEM StockCode="S047" GoesWith="S034 S039" >Coffee Grinder Brush</ITEM>
예4) ENTITY
파싱되지 않은 데이터
<!ELEMENT IMAGE EMPTY>
<!ATTLIST IMAGE Source ENTITY #REQUIRED>
<IMAGE Source="LOGO" //>
예5) ENTITIES
여러개의 파싱되지 않은 데이터 타입 선언
<!ELEMENT IMAGE EMPTY>
<!ATTLIST IMAGE Source ENTITIES #REQUIRED>
<IMAGE Source="LOGO LogoBmp "//>
예6) NMTOKEN
<!ELEMENT BOOK (#PCDATA)>
<!ATTLIST BOOK ISBN NMTOKEN #REQUIRED>
<BOOK ISBN="9-99999-999-9 ">The Portrait of a Lady</BOOK>
예7) NMTOKENS
<!ELEMENT SHIRT (#PCDATA)>
<!ATTLIST SHIRT Codes NMTOKENS #REQUIRED>
<SHIRT Codes="38 21 97 "></SHIRT>
3) 열거형 타입 - Class 속성의 값이 여러개 중의 하나를 가질 수 있도록 정의
Class 지정
<!ATTLIST FILM Class (finctional | instructional | documentary) "fictionsal">
Here's a complete XML document that shows the use of the Class attribute:
<?xml version="1.0">
<!DOCTYPE FILM
[
<!ELEMENT FILM (TItle, (STAR | NARRATOR | INSTRUCTOR))>
<!ATTLIST FILM Class (fictional | instructional | documentaty) "fictional" >
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT STAR (#PCDATA)>
<!ELEMENT NARRATOR (#PCDATA)>
<!ELEMENT INSTRUCTOR (#PCDATA)>
]
>
<FILM Class="instructional">
<TITLE>The Use and Care of XML</TITLE>
<NARRATOR>Michael Young</NARRATOR>
</FILM>
Class에 다른 값을 지정하면 유효성 에러가 발생한다.
NOTATION 지정
<!ELEMENT EXAMPLE_DOCUMENT (#PCDATA)>
<!ATTLIST EXAMPLE_DOCUMENT Format NOTATION (HTML | SGML | RTF) #REQUIRED>
<EXAMPLE_DOCUMENT Format="HTML" >
<![CDATA [
<html>
<head>
<title>Mike's Home Page</title>
</head>
<body>
<p>Welcome!</p>
</body>
</html>
]]
>
</EMAMPLE_DOCUMENT>
디폴트 선언
#REQUIRED - 모든 엘리먼트의 타입에 대해 연결될 속성의 값을 지정
#IMPLIED - 엘리먼트의 타입에 연결된 속성을 포함할 수도 있고, 생략할 수도 있다.
AttValue - 디폴트 속성
#FIXED AttValue - 고정할 때...
크리에이티브 커먼즈 라이선스