XSD
XSD란?
XSD는 XML 스키마 정의(XML Schema Definition)를 의미한다.
XSD는 XML 문서의 구조 및 해당 문서가 포함할 수 있는 적법한 요소와 속성을 명시한다.
즉, 해당 XML 문서가 유효한(valid) XML 문서로써 포함할 수 있는 관계를 정의한다.
XML 에서 스키마를 정의할 때는 XSD뿐만 아니라 앞서 배운 DTD를 사용할 수도 있다.
DTD의 단점
DTD는 오래전부터 엔티티를 정의할 수 있고, 빠른 개발을 위한 내부 DTD를 사용할 수 있어서 많이 사용되었다.
하지만 시간이 지날수록 다음과 같은 단점들이 발생한다.
XSD의 특징
DTD의 단점을 개선한 XSD는 다음과 같은 특징을 가진다.
XSD의 특징
DTD의 단점을 개선한 XSD는 다음과 같은 특징을 가진다.
XSD 문법
모든 XSD 문서의 루트 요소는 <schema>요소이다.
<schema>요소를 이용한 XML 스키마의 선언은 다음과 같은 문법을 따른다.
예제
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs= "http://www.w3.org/2001/XMLSchema"
targetNamespace="http://codingsam.com"
xmlns="http://codingsam.com"
elementFormDefault="qualified">
...
</xs:schema>
targetNamespace 속성은 요소를 정의할 XML 스키마 네임스페이스를 명시한다.
xmlns 속성은 기본 XML 스키마 네임스페이스를 명시한다.
elementFormDefault 속성은 해당 스키마를 이용해 선언한 XML 문서의 모든 요소가 네임스페이스를 만족한다는 것을 명시한다.
XSD 예제
food.xml
<?xml version="1.0" encoding="UTF-8"?>
<food>
<name>상추</name>
<type>야채</type>
<cost>2000</cost>
</food>
다음 예제는 앞선 XML 문서의 요소들을 정의한 DTD 파일 예제이다.
food.dtd
<!ELEMENT food (name, type, cost)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT cost (#PCDATA)>
다음 예제는 앞선 XML 문서의 요소들을 정의한 XSD 파일 예제이다.
food.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://codingsam.com"
xmlns="http://codingsam.com"
elementFormDefault="qualified">
<xs:element name="food">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="type" type="xs:string"/>
<xs:element name="cost" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
다음 예제는 외부 DTD 파일을 포함하는 XML 파일 예제이다.
food.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE food SYSTEM "food.dtd">
<food>
<name>상추</name>
<type>야채</type>
<cost>2000</cost>
</food>
다음 예제는 외부 XSD 파일을 포함하는 XML 파일 예제이다.
food.xml
<?xml version="1.0" encoding="UTF-8" ?>
<food
xmlns="http://codingsam.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://codingsam.com food.xsd">
<name>상추</name>
<type>야채</type>
<cost>2000</cost>
</food>
XSD 타입
XSD 에서는 사용자를 위해 다양한 타입을 제공한다.
또한, 사용자가 임의의 타입을 직접 정의하여 사용할 수도 있다.
XSD에서 기본적으로 제공하는 타입은 기본 타입과 파생된 타입으로 구분된다.
기본 타입(primitive datatype)
XSD에서 제공하는 기본 타입을 사용할 때에는 반드시 네임스페이스 선언 시 사용한 접두사를 붙여야 한다.
XSD 예제
<xs:element name="player" type="xs:string"/>
문자열(string)
문자열 타입은 문자, 줄 바꿈 문자(line feed), 개행 복귀 문자(carriage return), 탭 문자(tab)등을 포함할 수 있다.
XSD 예제
<xs:element name="student" type="xs:string"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<student>홍길동</student>
또는
<student>홍 길 동 </student>
날짜와 시간(dateTime)
날짜와 시간 타입은 날짜와 시간을 동시에 표현할 수 있다.
문법
yyyy-mm-ddthh:mm:ss
XSD 예제
<xs:element name="deadline: type="xs:dateTime"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<deadline>2017-07-01T09:00:00</deadline>
시간 간격(duration)
시간 간격 타입은 시간 사이의 간격을 표현할 수 있다.
문법
PnYnMnDTnHnMnS
XSD 예제
<xs:element name="season" type="xs:duration"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<season>P2YT10M</season> // 2년 10분
<season>PT60S</season> // 60초
<season>-P2Y</season> // -2년
실수(decimal)
실수 타입은 실수를 표현할 수 있다.
XSD 예제
<xs:element name="answer" type="xs:decimal"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<answer>12.5</answer>
<answer>+12345.678</answer>
<answer>-0.123</answer>
Tip : 실수(decimal) 타입이 표현할 수 있는 최대 자릿수는 18자리이다.
불리언(boolean)
불리언 타입은 참과 거짓을 표현할 수 있다.
XSD 예제
<xs:attribute name="disable" type="xs:boolean"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<rank disabled="true">10</rank>
anyURI
anyURI 타입은 통합 자원 식별자(URI)를 표현할 수 있다.
XSD 예제
<xs:attribute name="src" type="xs=anyURI"/>
XML 예제
<image src="http://codingsam.com/xml/images/uri.png"/>
XSD 기본 타입
타입 |
설명 |
string |
문자열을 표현함. |
boolean | 참 또는 거짓을 표현함. |
decimal | 소수를 표현함. |
float | 32비트 부동 소수점 수를 표현함. |
double | 64비트 부동 소수점 수를 표현함. |
duration | 시간 간격을 표현함. |
dateTime | 날짜와 시간을 표현함. (yyyy-mm-ddThh:mm:ss) |
time | 시간을 표현함. (hh:mm:ss) |
date | 날짜를 표현함. (yyyy-mm-dd) |
gYearMonth | 연도와 월을 표현함. (yyyy-mm) |
gYear | 연도를 표현함. (yyyy) |
gMonthDay | 월과 일을 표현함. (--mm-dd) |
gDay | 일을 표현함. (----dd) |
gMonth | 월을 표현함.(--mm--) |
hexBinary | 16진수를 표현함. |
base64Binary | base64 방식으로 인코딩된 이진 데이터를 표현함. |
hexBinary | 16진수를 표현함. |
base64Binary | base64 방식으로 인코딩된 이진 데이터를 표현함. |
anyURI | 절대 또는 상대 URI를 표현함. |
QName | [Namespace in XML] 문법을 만족하는 적법한 XML 이름을 표현함. |
NOTATION | <enumeration>요소를 사용하여 간단한 타입을 만들 때 사용함. |
파생된 타입(derived datatype)
파생된 타입이란 기본 타입으로부터 파생되어 생성된 타입을 의미한다.
파생된 타입을 사용할 때에는 기본 타입과 마찬가지로 반드시 네임스페이스 접두사를 붙여야 한다.
XSD 예제
<xs:element name="player" type="xs:normalizedString"/>
정규화된 문자열(normalizedString)
정규화된 문자열 타입은 문자열(string) 타입으로부터 파생된 타입이다.
이 타입은 기본 타입인 문자열 타입과 같이 문자를 포함할 수 있다.
하지만 XML 프로세서가 줄 바꿈 문자(line feed), 개행 복귀 문자(carriage return), 탭 문자(tab)를 제거할 것이다.
XSD 예제
<xs:element name="student" type="xs:normalizedString"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<student>홍 길 동 </student>
토큰(token)
토큰 타입은 기본 타입인 문자열(string) 타입으로부터 파생된 타입이다.
이 타입은 기본 타입인 문자열 타입과 같이 문자를 포함할 수 있다.
하지만 XML 프로세서가 줄 바꿈 문자(line feed), 개행 복귀 문자(carriage return), 탭 문자(tab), 문자열 앞 뒤의 공백, 여러 개의 띄어쓰기를 모두 제거할 것이다.
XSD 예제
<xs:element name="student" type="xs:token"/>
XML 예제
<student>홍 길 동 </student>
위의 예제에서 XML 프로세서는 탭 문자열 앞뒤의 공백, 그리고 여러 개의 띄어쓰기를 모두 제거할 것이다.
화면
홍길동
정수(integer)
정수 타입은 기본 타입인 소수(decimal) 타입으로부터 파생된 타입이다.
정수 타입은 소수 부분이 없는 정수를 나타낼 때 사용한다.
XSD 예제
<xs:element name="answer" type="xs:integer"/>
위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.
XML 예제
<answer>12</answer>
<answer>+12345</answer>
<answer>-123</answer>
XSD 파생된 타입
타입 |
설명 |
normalizedString |
줄 바꾸기 문자(line feed), 개행 복귀 문자(carriage return), 탭 문자(tab)를 포함하지 않는 문자열을 표현함. |
token | 줄 바꾸기 문자(line feed), 개행 복귀 문자(carriage return), 탭 문자(tab), 문자열 앞뒤의 공백, 여러 개의 띄어쓰기를 포함하지 않는 문자열을 표현함. |
language | 유효한 언어 아이디를 포함하는 문자열을 표현함. |
NMTOKENS | NMTOKEN 속성 타입을 표현함. |
NMTOKENS | NMTOKENS 속성 타입을 표현함. |
Name | 유효한 XML 이름을 포함하는 문자열을 표현함. |
NCName | [Namespace in XML] 문법을 만족하는 NCName을 표현함. |
ID | XML 에서 id 속성을 나타내는 문자열을 표현함. (XSD 속성값에만 사용함) |
IDREF | XML 에서 IDREF 속성을 나타내는 문자열을 표현함. (XSD 속성값에만 사용함) |
IDREFS | 여러 개의 id 값을 참조함. |
ENTITY | 엔티티를 참조함. |
ENTITIES | 여러 개의 엔티티를 참조함. |
integer | 정수를 표현함. |
positiveInteger | 양의 정수를 표현함. (1, 2, ...) |
NonNegativeInteger | 0과 양의 정수를 표현함. (0, 1, 2, ...) |
negativeInteger | 음의 정수를 표현함. (-1, -2, ...) |
NonPositiveInteger | 0과 음의 정수를 표현함. (0, -1, -2, ...) |
long | 64비트 정수를 표현함. |
int | 32비트 정수를 표현함. |
short | 16비트 정수를 표현함. |
byte | 8비트 정수를 표현함. |
unsignedLong | 부호없는 64비트 정수를 표현함. |
unsignedInt | 부호없는 32비트 정수를 표현함. |
unsignedShort | 부호없는 16비트 정수를 표현함. |
unsignedByte | 부호없는 8비트 정수를 표현함. |