Mark Up/XML XML/XSD
  • 728x90
    반응형

    XSD




    XSD란?



    XSD는 XML 스키마 정의(XML Schema Definition)를 의미한다.

    XSD는 XML 문서의 구조 및 해당 문서가 포함할 수 있는 적법한 요소와 속성을 명시한다.

    즉, 해당 XML 문서가 유효한(valid) XML 문서로써 포함할 수 있는 관계를 정의한다.


    XML 에서 스키마를 정의할 때는 XSD뿐만 아니라 앞서 배운 DTD를 사용할 수도 있다.



    DTD의 단점



    DTD는 오래전부터 엔티티를 정의할 수 있고, 빠른 개발을 위한 내부 DTD를 사용할 수 있어서 많이 사용되었다.

    하지만 시간이 지날수록 다음과 같은 단점들이 발생한다.


    1. 네임스페이스를 지원하지 않는다.
    2. XML 문법이 아닌 별도의 문법으로 작성해야 한다.
    3. 제한된 타입만을 지원한다
    4. 재사용과 확장이 불가능하다.
    위와 같은 단점 때문에 2001년 W3C에서는 새로운 스키마 언어인 XSD를 공표한다.


    XSD의 특징



    DTD의 단점을 개선한 XSD는 다음과 같은 특징을 가진다.


    1. 네임스페이스를 지원한다.
    2. XML 문법으로 작성할 수 있어 재사용과 확장이 쉽다.
    3. 정수, 문자열 등의 다양한 타입을 지원한다.

    XSD의 특징



    DTD의 단점을 개선한 XSD는 다음과 같은 특징을 가진다.


    1. 네임스페이스를 지원한다.
    2. XML 문법으로 작성할 수 있어 재사용과 확장이 쉽다.
    3. 정수, 문자열 등의 다양한 타입을 지원한다.

    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>


    xmlns:xs 속성은 XSD의 요소와 타입에 사용할 W3C의 XML 스키마 네임스페이스를 명시한다.

    targetNamespace 속성은 요소를 정의할 XML 스키마 네임스페이스를 명시한다.

    xmlns 속성은 기본 XML 스키마 네임스페이스를 명시한다.

    elementFormDefault 속성은 해당 스키마를 이용해 선언한 XML 문서의 모든 요소가 네임스페이스를 만족한다는 것을 명시한다.



    XSD 예제



    다음 예제는 간단한 XML 파일 예제이다.


    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


    • yyyy-mm-ddThh:mm:ss
    • T : 시간 부분이 시작됨을 알려주며, 반드시 표기해야 하는 문자이다.
    • hh:mm:ss: hh시 mm분 ss초를 나타낸다.

    XSD 예제

    <xs:element name="deadline: type="xs:dateTime"/>


    위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.


    XML 예제

    <deadline>2017-07-01T09:00:00</deadline>



    시간 간격(duration)



    시간 간격 타입은 시간 사이의 간격을 표현할 수 있다.


    문법

    PnYnMnDTnHnMnS


    • P : 기간을 의미하며 반드시 표기해야 하는 문자이다.
    • nYnMnD : 기간을 연월일로 나타낸다.
    • T : 시간 부분이 시작됨을 알려주며, 시간 부분을 나타낼 때는 반드시 표기해야한다.
    • nHnMnS : 기간을 시분초로 나타낸다.

    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"/>


    위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.


    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"/>


    위의 XSD 예제에서 정의한 요소는 XML 문서에서 다음과 같이 표현될 수 있다.


    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비트 정수를 표현함.






    728x90
    반응형

    'Mark Up > XML' 카테고리의 다른 글

    XSD 복합 타입  (0) 2018.11.12
    XSD 단순 타입  (0) 2018.11.12
    XML/DTD  (0) 2018.11.09
    XML/XPath  (0) 2018.11.09
    XML 노드  (0) 2018.11.05
상단으로