|
|
|
|
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) |
|
페이싯들을 이용하여 기반타입을 제한하는 방법 |
내용 모델과 특성 선언을 이용하여 기반 타입을 확장하는 방법 |
'복잡한 타입'을 정의하기 위해서는 complexType을 사용하여 정의할 수 있고 정의 방법은 다음과 같다.
|
|
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”> |
그룹 요소는 아래와 같이 선언하며, 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=”to” type=”string” |
위에서 보이는 것처럼 <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”?> |
! 와일드 카드
요소나 속성의 내용에 특정 네임스페이스나 각 네임스페이스들의 리스트에 속한 요소들이 포함되도록 선언하는 것을 와일드 카드라고 한다.
와일드 카드는 네임스페이스에 속한다는 것 이외에 어떠한 제약도 필요 없을 때 사용할 수 있다.
<any minOccurs=”요소의 최소 사용횟수”
maxOccurs=”요소의 최대 사용횟수”
namespace=”허용되는 네임스페이스들”
processContents=”lax|skip|strict”>
요소의 사용 횟수를 제어하기 위해 minOccurs와 maxOccurs를 사용하며, ‘허용되는 네임스페이스들을 모두 공백으로 구분하여 나열한다. 이렇게 하면 나열한 네임스페이스에 속하는 모든 요소들은 사용할 수 있게 된다.
또한 몇 개의 예약어를 사용할 수 있는데 그 예약어의 의미는 다음과 같다.
##local : 네임스페이스와 결합되지 않은 요소들을 사용할수 있음
##targetNamespace : TargetNamespace에 속하는 요소들만 사용할 수 있음
##other : TargetNamespace 이외에 사용하는 요소들을 사용할 수 있음
##any : 모든 네임스페이스에 속하는 요소들을 사용할 수 있음
어떤 네임스페이스에 속하는 요소라도 <note>라는 요소의 내용으로 사용하려고 하면 이때 유효성 검증은 XML 스키마에 접근 가능할 때라는 것이다.
|
<element name=”note”> |
와일드 카드를 선언하는 방법으로 사용법은 요소 와일드 카드와 같다.
|
<anyAttribute |
! 요약정리
- XML 스키마는 DTD와는 다르게 XML 문법을 따르며 다양한 데이터 형식을 제공해 준다.
- XML 스키마는 네임스페이스를 완벽하게 지원하며, 다양한 데이터형과 콘텐츠 모델을 지원한다.
- XML 스키마는 구조와 데이터 타입, 두 부분으로 나누어져 있다.
- XML 스키마의 데이터 타입은 기본 데이터 타입(primitive)과 파생된(derived)
- 데이터 타입으로 나눌 수 있다.
- 간단한 타입의 정의는 특성값의 데이터 타입을 지정하거나 자식이 없는 요소 내용의
- 데이터 타입을 지정할 경우에 사용한다.
- 복잡한 타입은 '간단한 타입'에 비해 속성에 대한 선언과 DTD와 같이 요소의
- 내용모델을 기술할 수 있으며, 페이싯들을 이용하여 기반타입을 제한하거나, 내용
- 모델과 특성 선언을 이용하여 기반 타입을 확장할 수 있다.
|
|