CAFE

XML.NET/Open API

[21기 이향미] XML스키마 기술문서

작성자21기 이향미|작성시간11.04.06|조회수601 목록 댓글 0

! XML Schema?

n  다양한 데이터를 표현하고 XML구조를 정의하는 문서모델의 한 종류

 

!  DTD의 문제점

XML 스키마를 이용하는 목적을 알기 위해서는 DTD의 문제점을 알아야 한다.

 

-      DTD는 확장 될 수 없다.

-      DTD는 데이터로 XML을 제대로 기술 할 수 없다.

-      DTD는 네임스페이스를 제대로 지원하지 못한다.

-      DTD는 하나의 문서에만 연관 될 수 있다.

-      DTD는 지원하는 데이터 타입의 종류가 많지 않다.

-      DTD는 상속의 개념이 존재하지 않는다.

-      DTD의 문법은 XML 문법과 다르며, DOM을 지원하지 못한다.

 

! DTD와 스키마의 비교

 

DTD

        XML 스키마

문법

XML과 유사한 다른 문법

XML 1.0 spec만족

지원 어플리케이션

DTD는 역사적으로 XML스키마보다 오래 되었기 때문에 DTD를 지원하는 어플리케이션은 풍부

DOM, XSLT, XML 인식 브라우저등을 포함하는 XML툴을 거의 모두 사용

DOM 지원

DOM을 통하여 조작할 수 없음

DOM을 통한 조작 및 디스플레이 가능

Contents Model

약함 순차, 선택 리스트만 제공

강함 순차, 리스트 함께 사용 가능

Data Type 정의

문자열, 토큰, ID와 그 밖의 몇몇 데이터 타입만 지원

문자열, 숫자, 날짜/시간, 구조를 포함하는 자주 쓰이는 데이터 타입을 지원

Namespace

전역 이름만 사용 / 제한적 지원

전역 및 로컬 이름사용 / 완벽 지원

상속성

불가능

            가능

확장성

제한됨, 확장을 위해서는 XML 1.0권고안을 바꾸어야 함

제한없음

기본 제약 조건

있음 이상적 측면보다는 SGML과의 호환성을 유지하는 목표 때문

없음 – XML Schema의 대부분은 최신 프로그래밍 언어와 기술에 근거

동적 Schema

불가능 – DTD는 실제로 읽기만 가능

가능 – XML 스키마는 런 타임시 선택 혹은 사용자와 상호작용의 결과로 변경도 가능함

 

! XML 스키마의 루트 요소

XML 스키마의 루트 요소는 항상 <schema>이며 다음과 같이 선언.

 

<?xml version=’1.0’?>

<schema xmlns =’http://www.w3.org/2001/XMLSchema’>

<!—응답 메시지 (work-in-progress) -->

<element name=’Amount’/>

</schema>

 

위 예제 스키마에는 Amount라는 이름을 가진 요소 한 개를 정의하고 있음

 

 

 

! 네임스페이스

n  네임스페이스란?

위의 예제에서 Amount라는 요소를 정의한 스키마를 만들었는데 만약, 다른 사람이 Amount라는 요소를 만든다면 이것이 내가 만든 건지 다른 사람이 만든 건지 구별할 수 없게 된다. 이때 사용하는 것이 네임스페이스이다.

 

n  targetNamespace 속성

    네임스페이스 식별자를 설정할 때 사용하는 속성 (URI)

 

 

네임스페이스 예제

 

<?xml version=’1.0’?>

<schema xmlns =’http://www.w3.org/2001/XMLSchema’ targetNamespace = ‘urn:Commerce’>

<!—응답 메시지 (work-in-progress) -->

<element name=’Amount’/>

</schema>

 

스키마 요소에 targetNamespace 속성을 추가하고, 그 속성값으로 Commerce URN을 지정하였다. 위 예제의 경우 ‘Amount’ 요소가 현재 Commerce 네임스페이스에 유일하게 정의된다.

 

 

 

!  요소 정의

 

요소는 element라는 태그를 이용하여 정의한다.

Type 속성을 이용하여 요소에 어떤 유형의 데이터가 포함되어 있는지 나타낼 수 있다.

 

 

<?xml version=’1.0’?>

<schema xmlns =’http://www.w3.org/2001/XMLSchema

targetNamespace = ‘urn:Commerce’>

<!—응답 메시지 (work-in-progress) -->

<element name=’Amount’  type = ‘double’/>

</schema>

위 예는 Amount 요소가 double이라는 데이터 유형만 갖도록 스키마를 정의하였다.

 

!  nil

 

<?xml version=’1.0’?>

<schema xmlns =’http://www.w3.org/2001/XMLSchema

targetNamespace = ‘urn:Commerce’>

<!—응답 메시지 (work-in-progress) -->

<element name=’Amount’  type = ‘double’  nillable=’true’/>

</schema>

 

 

요소의 nillable 속성을 참(true) 또는 거짓(false)으로 지정하여 설정 할 수 있다.

Nillable 속성을 지정하지 않으면 기본 설정 값은 거짓이다.

위의 예제는 Amount요소가 null 값을 가질 수 있다.

 

  

! 간단한 타입의 정의

XML 스키마는 데이터 타입을 정의하는 방법을 다양하게 가지고 있다. XML 스키마는 데이터 타입을 정의할 수 있는 방법을 제공함으로써 반복되는 구조를 데이터 타입으로 정의하여 재사용할 수 있다는 장점이 있다.
'
간단한 타입' 정의는 특성 값의 데이터 타입을 지정하거나, 자식이 없는 요소 내용의 데이터 타입을 지정할 경우 사용하며 정의 방법은 다음과 같다.

 

<simpleType name = “이름”>

 <restriction base=”XSD에 미리 정의된 simpleType”>

   <!—여러가지 제한된 표현 -->

 </restriction>

</simpleType>

simpleType을 제한함으로써 새로운 simpleType을 유도할 수 있다. 다른 말로 하면 기존의
simpleType
이 허용하는 범위를 제한해서 기존의 simpleType의 부분집합이 되도록 할 수 있다.
값의 허용범위를 제한 하는데는 여러 가지 방법이 사용된다

 

데이터 타입 정의 예제 1

① 10000에서 99999의 값을 갖는 “mylnterger”라는 새로운 simpleType을 생성한다.

② XML 스키마에 이미 정의되어 있는 “integer” 형을 기초로 하여 값의 범위를 10000에서 9999까지로 제한한다. 여기서 <restrict> 요소는 제한범위를 설정하는데 사용되고, base 속성은 기준이 되는 simpleType을 지정.
③ <restriction>
요소의 자식요소로 사용된 <minInclusive> <maxInclusive>는 이름에서 짐작하듯이 최소값과 최대값을 지정

 

 

데이터 타입 정의 예제 2

 

 

① String type에서 유도된 “myString” 이라는 simpleType

② 3개의 숫자와 하이픈 그리고 2개의 대문자로 표현하는 정규식(regular expression‎)

"\d{3}-[A-Z]{2}" <pattern> 이라는 요소를 이용하여 나타내고 있는데,

XML 스키마는 정규식을 사용함으로써 보다 다양한 제어가 가능하다.

 

데이터 타입 정의 예제 3

① <enumeration>요소를 사용하여 요소의 내용을 특정 값들로 제한하였다.

이 형식을 이용한 요소의 내용은 “ABC, BCD, CDE” 셋 중의 하나로 나타나게 된다.

 

 

<restriction> 요소의 자식요소로 사용할 수 있는 제한 요소들은 다음과 같다.

minExclusive

형식의 최소값 지정(지정한 값을 포함하지 않음)

minIncusive

형식의 최소값 지정(지정한 값을 포함)

maxExclusive

형식의 최대값 지정(지정한 값을 포함하지 않음)

maxInclusive

형식의 최대값 지정(지정한 값을 포함)

totalDigits

숫자 형식의 최대 자리수 지정

fractionDigits

숫자 형식의 소수 부분 자리수 지정

length

리스트 형식에 들어가는 항목들의 개수나 문자열 형식에 들어가는 문자들의 개수 지정

minLength

리스트 형식에 들어가는 항목들의 최소 개수나 문자열 형식에 들어가는 문자들의 최소 개수 지정

maxLength

리스트 형식에 들어가는 항목들의 최대 개수나 문자열 형식에 들어가는 문자들의 최대 개수 지정

Enumeration

나열형에 들어가는 값들을 지정

Whitespace

공백이 다루어지는 방법 지정

pattern

정규식을 사용하여 문자열 형식들을 제한

위의 내용은 <restriction> 요소의 하위 요소로 사용되어 simple type의 형식을 제한하는데 사용되는 요소들로 이러한 제한 요소들을 facets(페이싯)이라는 용어로 설명하기도 한다.

 

 

! 복잡한 타입의 정의

'복잡한 타입' '간단한 타입'에 비해 속성에 대한 선언과 DTD와 같이 요소의 내용모델을 기술할 수 있는데 '복잡한 타입'은 다음과 같은 두 가지 방법으로 제한하거나 확장할 수 있다

 제한(restriction)

 확장(extension)

 페이싯들을 이용하여 기반타입을 제한하는 방법 
'
간단한 타입' <restriction>과 같은 역할

 내용 모델과 특성 선언을 이용하여 기반 타입을 확장하는 방법

 

'복잡한 타입'을 정의하기 위해서는 complexType을 사용하여 정의할 수 있고 정의 방법은 다음과 같다.

  <?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="age"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="myInteger"/>
<xs:simpleType name="myInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="10"/>
<xs:maxInclusive value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

user 요소가 순서대로 name, age 요소를 가질 수 있도록 선언되어 있는 것을 알 수 있습니다. 이때 복잡한 타입이 사용되었다.

 

 

! 컨텐츠 모델(Contents Model)

요소의 내용을 좀더 세밀하게 제어하는 방법.
XSD
에서는 DTD보다 훨씬 더 유연한 방법을 제공한다는 것을 알게 된다.

■ <sequence> 요소

이 요소는 순서대로 사용되는 요소들을 정의할 때 사용할 수 있다.

<sequence minOccurs=”요소의 최소 사용횟수” maxOccurs=”요소의 최대 사용횟수”>

   <element…………………/>

   <element…………………/>

</sequence>

요소의 사용 횟수는 <sequence> 요소 안에 정의된 전체 요소에 대해 나타나는 횟수를 정의할 수 있고, 하위 요소로는 <element> 요소 뿐 아니라 다른 <sequence>, <choice> , <group> 등에 대한 참조를 포함할 수 있다.

 

■ <choice> 요소

하위 요소로 정의된 것 여러 개의 요소 중 하나가 사용될 수 있도록 한다

<choice minOccurs=”요소의 최소 사용횟수” maxOccurs=”요소의 최대 사용횟수”>

   <element…………………/>

   <element…………………/>

</choice>

■ <group> 요소

이 그룹 요소는 전역 요소 그룹을 참조할 수 있으며, 전역 요소 그룹이란 요소들의 그룹을 만들어 재사용 가능하도록 만들어 놓은 것을 말한다
전역 요소 그룹은 루트 요소인 <schema>의 바로 하위 요소로 선언되어야 하며, <group>요소를 사용하여 참조할 수 있다.

전역 요소 그룹 사용예

 <group name=”noteGroup”>
<sequence>
<element name=”to” type=”string” />
<element name=”from” type=”string” />
<element name=”heading” type=”string” />
<element name=”body” type=”string” />
</sequence>
</group>
<group name=”noteGroup”>
<sequence>
<element name=”to” type=”string” />
<element name=”from” type=”string” />
<element name=”heading” type=”string” />
<element name=”body” type=”string” />
</sequence>
</group>

 

그룹 요소는 아래와 같이 선언하며, ref 속성에 미리 정의한 요소 그룹의 이름을 사용한다.

 

<group ref=”전역 요소 그룹 이름” minOccurs=”요소의 최소 사용횟수” maxOccurs=”요소의 최대 사용 횟수”/>

 

■ <all> 요소

all 요소는 하위 요소로 정의된 것이 순서와 상관없이 나타나게 할 때 사용할 수 있다.

<all minOccurs=”0 | 1” maxOccurs=”1”>

<element …………………/>

<element …………………/>

</all>

<all> 요소의 자식 요소들은 XML 문서 안에서 최대 한 번만 나타날 수 있으며, 그 자식 요소로 <element>만 포함할 수 있고 <sequence>,<choice>,<group>은 포함할 수 없다.

 

 

! attribute 요소의 속성

■ <attribute> 요소

속성은 <attribute> 요소를 사용하여 선언할 수 있다.

 

사용법

  <attribute name=”속성의 이름
type=”
요소의 형식
ref=”
전역 속성 참조
form=”qualified | unqualified”
use=”optional | prohibited | required “
default=”
기본값
fixed=”
고정값” >

 ☞ 사용예

 <attribute name=”to” type=”string”
 use=”required” />

위에서 보이는 것처럼 <attribute> 요소의 사용은 <element> 요소의 사용법과 거의 동일하다는 것을 알 수 있다. 사용되는 속성들도 모두 같은 의미를 가지고 있다. 심지어 속성의 선언도 요소의 선언과 마찬가지로 전역 형식으로 선언하여 그것을 참조하여 이용할 수도 있다.

속성의 횟수 제어

요소는 minOccrus, maxOccurs 을 사용하여 여러 가지로 나타나는 횟수를 제어할 수 있었지만,
속성이 나타나는 횟수 제어는 use를 사용하여 세가지로 제어할 수 있게 된다.

                 예제

                   설명

<attribute name=”to” type=”string” use=”optional”/

사용하여도 되고 사용하지 않아도 된다.

<attribute name=”to” type=”string” use=”prohibited”/>

사용하지 않아야 한다.

<attribute name=”to” type=”string” use=”required”/>

반드시 사용하여야 한다.

주의할 점은 요소에서와 마찬가지로 전역으로 속성을 선언했을 때는 use를 사용할 수 없다는 것이다.  use를 사용하지 않으면 기본값은 “optional” 이 된다.

 

 

 

■ <attributeGroup> 요소

요소를 선언할 때 <group>을 사용하여 요소의 그룹을 정의하고 재사용 했던 것과 같이 속성을 선언할 때 역시 <attributeGroup>을 사용하여 속성 그룹을 정의하고 정의된 속성 그룹을 재사용 할 수 있다.

 <?xml version=”1.0”?>
<schema xmlna=”http://www.w3.org/2001/XMLSchema”
targetNamespace=”http://www.koreadu.ac.kr/xml”
xmlns:target=”http://www.koreadu.ac.kr/xml” elementFormDefault=”qualified” >
<attribyteGroup name=”noteAtt” >
<attribute name=”to” type=”string” />
<attribute name=”from” type=”string” />
</attributeGroup>
<element name=”note”>
<complexType>
<sequence>
<element ref=”target:heading” />
<element ref=”target:body” />
</sequence>
</complexType>
<attributeGroup ref=”target:noteAtt” />
</element>
</schema>

 

 

!  와일드 카드

요소나 속성의 내용에 특정 네임스페이스나 각 네임스페이스들의 리스트에 속한 요소들이 포함되도록 선언하는 것을 와일드 카드라고 한다.

와일드 카드는 네임스페이스에 속한다는 것 이외에 어떠한 제약도 필요 없을 때 사용할 수 있다.

 

 

<any minOccurs=”요소의 최소 사용횟수

maxOccurs=”요소의 최대 사용횟수

namespace=”허용되는 네임스페이스들

processContents=”lax|skip|strict”>

 

요소의 사용 횟수를 제어하기 위해 minOccurs maxOccurs를 사용하며, ‘허용되는 네임스페이스들을 모두 공백으로 구분하여 나열한다.  이렇게 하면 나열한 네임스페이스에 속하는 모든 요소들은 사용할 수 있게 된다
 
또한 몇 개의 예약어를 사용할 수 있는데 그 예약어의 의미는 다음과 같다.

 ##local  : 네임스페이스와 결합되지 않은 요소들을 사용할수 있음

 ##targetNamespace  :  TargetNamespace에 속하는 요소들만 사용할 수 있음

 ##other  :  TargetNamespace 이외에 사용하는 요소들을 사용할 수 있음

 ##any :  모든 네임스페이스에 속하는 요소들을 사용할 수 있음

 

어떤 네임스페이스에 속하는 요소라도 <note>라는 요소의 내용으로 사용하려고 하면 이때 유효성 검증은 XML 스키마에 접근 가능할 때라는 것이다.

 <element name=”note”>
<complexType>
<any namespace=”##any” processContents=”lax” />
</complexType>
</element>

 와일드 카드를 선언하는 방법으로 사용법은 요소 와일드 카드와 같다.

 <anyAttribute
namespace=”
허용되는 네임스페이스들
processContents=”lax | skip | strict” >

 

 

 ! 요약정리

-  XML 스키마는 DTD와는 다르게 XML 문법을 따르며 다양한 데이터 형식을 제공해 준다.

-  XML 스키마는 네임스페이스를 완벽하게 지원하며, 다양한 데이터형과 콘텐츠 모델을 지원한다.  

-  XML 스키마는 구조와 데이터 타입, 두 부분으로 나누어져 있다
-  XML
스키마의 데이터 타입은 기본 데이터 타입(primitive)과 파생된
(derived)
- 
데이터 타입으로 나눌 수 있다
.  
- 
간단한 타입의 정의는 특성값의 데이터 타입을 지정하거나 자식이 없는 요소 내용의

- 
데이터 타입을 지정할 경우에 사용한다.  
- 
복잡한 타입은 '간단한 타입'에 비해 속성에 대한 선언과 DTD와 같이 요소의

- 
내용모델을 기술할 수 있으며, 페이싯들을 이용하여 기반타입을 제한하거나, 내용

- 
모델과 특성 선언을 이용하여 기반 타입을 확장할 수 있다.

 

 

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼