XSD (XML Schema Definition) 정의
XSD(XML Schema Definition)는 XML의 유효성 검증을 위한 스키마입니다.
- XML에 대해선 언급하지는 않겠습니다. (다 아시잖아유~)
XML의 특징 중 하나를 예로 들어보면, 작성 규칙만 지켜진다면 입력이 자유롭다는 장점이 있습니다.
- 이러한 장점이 오히려 단점이 되기도 합니다.
- 문자열이 위치해야 할 자리에 숫자가 들어온다거나, 아니면 반대의 상황
- <아우디>K5</아우디>, <동물>자동차</동물> 과 같은 예로, Category에 속할 수 없는 값들이 들어갈 가능성이 있습니다.
- XML을 수동으로(요즘은 툴도 많지만...) 작성하다보면 오타가 발생하기도 하죠
이런 XML의 단점들을 일부 해소해 줄 수 있는게 바로 XSD입니다.
XSD는 기본적으로 아래와 같은 48가지의 데이터 형식을 사용합니다.
simpleType |
사용 예 (콤마로 구분) |
설명 |
String |
Confirm this is Electric |
문자열 |
normalizedString |
Confirm this is Electric |
문자열 |
token |
Confirm this is Electric |
문자열 |
byte |
-1, 126 |
바이트 타입 |
unsignedByte |
0, 126 |
부호화 되지 않은 바이트 타입 |
base64Binary |
GpM7 |
64 비트 바이너리 |
hexBinary |
0FB7 |
16진수 바이너리 |
integer |
-126789, -1, 0, 1, 126789 |
16비트 정수형 |
positiveInteger |
1, 126789 |
16비트 양의 정수형 |
negativeInteger |
-1, -126789 |
16비트 음의 정수형 |
nonNegativeInteger |
0, 1, 126789 |
0을 포함하는 16비트 양의 정수형 |
nonPositiveInteger |
0, -1, -126789 |
0을 포함하는 16비트 음의 정수형 |
Int |
-1, 126789675 |
32비트 정수형 |
unsignedInt |
0, 1267896754 |
부호화 되지 않은 32비트 정수형 |
long |
-1, 12678967543233 |
64비트 정수형 |
unsignedInt |
0, 12678967543233 |
부호화 되지 않은 64비트 정수형 |
short |
-1, 12678 |
8비트 정수형 |
unsignedShort |
0, 12678 |
부호화 되지 않은 8비트 정수형 |
decimal |
-1.23, 0, 123.4, 1000.00 |
단정도 고정 소수점 형 |
float |
-INF, -1E4, -0, 0, 12.78E-2, 12, INF,
|
32비트 단정도 부동 소수점 형 |
double |
-INF, -1E4, -0, 0, 12.78E-2, 12, INF,
|
64비트 배정도 부동 소수점 형 |
boolean |
True, false, 0, 1 |
Boolean 타입 |
time |
13:20:00.000, 13:20:00.000- |
시간 |
datetime |
1999-05-31T13:20:00.000- |
날짜와 시간 |
duration |
P1Y2M3DT10H30M12.3S |
예는 1년 2개월 3일 10시간 30분 12.3 초의 기간을 나타냄 |
date |
1999-05-31 |
날짜 |
gMonth |
__05__ |
월 |
gYear |
2003 |
년 |
gYearMonth |
2003-02 |
연 월 |
gDay |
___31 |
일 |
gMonthDay |
__05_31 |
월 일 |
Name |
shipTo |
XML 1.0의 Name 타입 |
QName |
po:USAddress |
XML Namespace QName |
NCName |
USAddress |
XML Namespace NCName |
anyURI |
http://www.example.com/ |
유효한 URI |
language |
en-GB, en-US, fr |
XML 1.0 에서 지정한 인코딩 규약 |
ID |
|
XML 1.0 ID 속성 타입 |
IDREF |
|
XML 1.0 IDREF 속성 타입 |
IDREFS |
|
XML 1.0 IDREFS 속성 타입 |
ENTITY |
|
XML 1.0 ENTITY 속성 타입 |
ENTITES |
|
XML 1.0 ENTITIES 속성타입 |
NOTATION |
|
XML 1.0 NOTATION 속성 타입 |
NMTOKENS |
US, Brésil |
XML 1.0 NMTOKEN 타입 |
NMTOKENS |
|
XML 1.0 NMTOKES 타입 |
이 데이터 형식들을 이용해 요소의 자료형을 정의할 수 있습니다.
XSD 정의 방법
그럼, XSD를 이제 어떻게 정의할 수 있는지 알아보도록 하겠습니다.
XSD에는 <simpleType>과 <complexType>이 존재하는데요
말 그대로,
<simpleType>은 위에서 명시한 데이터 형식들을 이용해 새로운 형식을 만들어 낼 때
- 예를 들면, string 값을 이용해서 우편번호 형식을 지정하는 경우
<complexType>은 여러 조건이 다중으로 붙어있는 형식이라고 보시면 됩니다.
- 아래 예제 XML, XSD들은 ms예제를 이용했습니다.
- https://msdn.microsoft.com/ko-kr/library/ms256129(v=vs.120).aspx
<simpleType>은..
아래의 xsd을 예로 들어보면..
<xs:element name="quantity"> // 태그 이름 <xs:simpleType> <xs:restriction base="xs:positiveInteger"> // 양의 정수 <xs:maxExclusive value="100"/> // 최대 숫자 </xs:restriction> </xs:simpleType> </xs:element> |
위의 정의 형식은
<quantity></quantity> 는 정수형으로 최대 100까지 설정할 수 있다.
를 의미합니다.
<complexType>은....
역시 아래의 xsd를 예로 들면..
<xs:complexType name="Items"> // complexType <items></items> 정의 <xs:sequence> <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> // <items>의 하위 항목은 <item> <xs:complexType> <xs:sequence> <xs:element name="productName" type="xs:string"/> // <item>의 하위 항목은 <productName>으로 문자열 <xs:element name="quantity"> // <item>의 또 다른 하위 항목은 <quantity> <xs:simpleType> // <quantity>는 정수형으로 최대 100까지 <xs:restriction base="xs:positiveInteger"> <xs:maxExclusive value="100"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="USPrice" type="xs:decimal"/> // <item>의 또 다른 하위 항목은 <USPrice>로 숫자형 (소수포함) <xs:element ref="comment" minOccurs="0"/> // <item>의 하위 항목은 <comment>로 선택 가능합니다. (minOccurs=0) 최소 0개 등장해야 함. <xs:element name="shipDate" type="xs:date" minOccurs="0"/> // <item>의 하위 항목은 <shipDate>로 역시 넣던지 말던지 선택 가능 </xs:sequence> <xs:attribute name="partNum" type="SKU" use="required"/> // <item>의 속성으로 partNum이 존재함, 형식은 SKU로 따로 정의했음 </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- Stock Keeping Unit, a code for identifying products --> <xs:simpleType name="SKU"> // <item> 속성 중 하나인 partNum의 형식 <xs:restriction base="xs:string"> // 문자열 <xs:pattern value="\d{3}-[A-Z]{2}"/> // 정수형 3자리-문자열 A~Z중 2자리 </xs:restriction> </xs:simpleType> |
위 xsd를 지킨 xml 포맷은 바로 아래와 같습니다.
<items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <comment>Confirm this is electric</comment> </item> <item partNum="926-AA"> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate> </item> </items> |
그럼 다음 포스팅에서는 이렇게 생성한 xsd를 이용해 xml의 유효성을 어떻게 검증하는지 알아보도록 하겠습니다.