Basics/Definitions (xml, ini, csv..)

XSD (XML Schema Definition) 정의

MOLOKINI 2016. 4. 23. 13:27

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, NaN

32비트 단정도 부동 소수점 형

double

-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN

64비트 배정도 부동 소수점 형

boolean

True, false, 0, 1

Boolean 타입

time

13:20:00.000, 13:20:00.000-05:00

시간

datetime

1999-05-31T13:20:00.000-05:00

날짜와 시간

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

US UK,
Brésil Canada Mexique

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의 유효성을 어떻게 검증하는지 알아보도록 하겠습니다.