[XML.NET] 6. XML 스키마(Schema)

스키마는 DTD처럼 XML문서의 구조를 표현하기 위해서 사용합니다.

W3C에서는 DTD나 XML 스키마를 정의하고 이것에 맞게 XML을 작성하는 것을 Well Formed XML이라고 말합니다.

DTD는 하나의 시스템 내에서 사용할 XML 데이터의 구조를 정의하여 유효성을 점검할 때 사용하며 스키마는 서로 다른 시스템 사이의 데이터를 주고 받아 사용할 수 있게 데이터 표준화를 위해 제공하고 있습니다.

프로그램 방식으로 데이터를 처리할 때는 명확하게 문서의 구조를 정의하고 이를 기반으로 데이터 소스를 목적에 맞게 사용할 때 DTD나 스키마를 통해 안정성을 제공할 수 있습니다.

DTD로 XML 문서 구조를 정의하면 표준화에 사용하기 힘든 이유는 다음과 같습니다.

DTD는 XML 문서 구조와 다른 문법을 사용하므로 별도의 처리 시스템이 필요합니다.

 DTD는 네임 스페이스를 제공하지 않습니다.

DTD는 하나의 문서에만 적용할 수 있습니다.

DTD는 지원하는 데이터 타입의 종류가 한정되어 있습니다.

DTD는 상속 개념을 제공하지 않습니다.

DTD는 XML문법과 달라서 DOM을 지원하지 않습니다.

이러한 한계점을 극복하기 위해 W3C에서는 XML 스키마 표준을 정의하고 이를 통해 XML 문서 구조를 정의할 수 있게 제공하고 있습니다.

다음은 DTD와 스키마를 비교한 것입니다.

 DTD스키마
문법XML과 유사한 문법XML 1.0 표준에 만족
DOM 지원DOM 기술을 지원하지 않음DOM을 통한 조작 가능
컨텐츠 모델순차, 선택 리스트만 제공순차, 리스트 복합적으로 사용 가능
데이터 타입문자열, 토큰, ID와 그 외에한정된 타입 지원문장려, 숫자, 날짜/시간 및 새로운 형식정의를 할 수 있음
Namespace전역 이름만 사용전역/ 로컬 이름 모두 사용 가능
상속성제공하지 않음제공
확장성한계가 있음제한 없음
기본 제약 조건있음없음
동적 스키마불가능 – 읽기만 가능가능 – 런타임에 상호작용으로 변경 가능

XML 스키마는 문서의 구조와 데이터를 기술하기 위하여 구조와 데이터 타입으로 나누어져 있습니다.

구조는 데이터 타입들로부터 만들어질 수 있는 조합을 의미합니다.

데이터 타입은 기본 데이터 타입과 파생 데이터 타입이 있습니다.

XML 스키마 선언은 <xsd:schema> 요소로 시작하며 최상위 요소는 항상 스키마여야 합니다.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns="schema.xsd"
                 targetNamespace = "schema.xsd"
                 elementFormDefault = "qualified">

다음은 스키마 선언에서 사용하는 특성들입니다.

특성의미
xmlns:xsdXML 스키마의 네임스페이스 지정
xmlns예약되어 있는 키워드로 네임스페이스 정의
targetNamespace스키마에 정의한 요소나 속성들을 다른 XML 문서에서 식별할 수 있게네임스페이스 지정
elementFormDefaultelementFormDefault 값이 qualified일 때는 모든 요소는 targetNamespace에서 선언한 네임스페이스를 사용하고 unqualified일 때는 targetNamespace에서 선언한 네임스페이스를 사용하지 않아도 됨

스키마에서 요소를 정의할 때는 element 태그를 이용해서 정의합니다. Type 속성을 이용하여 요소에 어떠한 데이터 형식을 포함할 수 있는지 나타낼 수 있습니다.

<?xml version="1.0" encoding="euc-kr"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="book" type="xsd:string"/>
</xsd:schema>

스키마에서 특성은 attribute 태크를 사용하여 정의합니다. 자세한 문법 사항은 W3C 권고안을 참고하세요.

<xsd:element name="price">
    <xsd:complexType>
        <xsd:simpleContent>
            <xsd:extension base="xsd:int">
                <xsd:attribute name="단위" type="xsd:string" use="optional" default="원"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
</xsd:element>

다음은 책 목록을 표현하기 위한 스키마 파일의 내용과 책 목록 데이터를 표현한 파일의 내용입니다.

먼저 XML 문서 구조를 정의한 data.xsd 문서 내용입니다.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:books-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:books-schema">

 <xsd:element name="books" type="booksType"/>

 <xsd:complexType name="booksType">
  <xsd:sequence maxOccurs="unbounded">
   <xsd:element name="book"  type="bookType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="bookType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="price"  type="xsd:int"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:schema>

다음은 책 목록을 XML로 표현한 data.xml 문서 내용입니다.

<?xml version="1.0" encoding="utf-8"?>
<books xmlns="urn:books-schema">
  <book>
    <title>XML.NET 과 ADO.NET</title>
    <price>22000</price>
  </book>
</books>