Transcript XML Schema

XML Schema
• XML 스키마
- 문서 구조를 정의하는 방법
- DTD 문제점을 보완하기 위해서 W3C에서 개발
• DTD 문제점
- XML 문법이 아닌 EBNF 문법 형식을 따름
- 작성법을 별도로 익혀야 하는 번거로움이 있음
- DTD는 재사용성과 확장성이 낮음
- DTD는 제한적인 데이터 타입만 지원
- 문서내용을 좀 더 정확하게 표현하기 어려움
• XML 스키마 목표
- 문서 클래스에 대해 더욱 강력한 또는 느슨한 제한 허용
- 여러 개의 네임스페이스에 속한 마크업으로
구성된 문서도 유효성 검증 가능
- 요소, 속성 및 데이터 타입 정의를 상속할 수 있는 방법을 제공
- SQL 과 자바와 같은 언어에서 볼 수 있는 바이트, 데이터, 정수와
같은 기본 데이터 타입 지원
- XML을 관계형, 객체로 가져오거나 내보내는 것을 지원하는
형식 체계에 대한 정의할 수 있도록 지원
- 기존의 데이터 타입에 범위와 길이와 같은 특정 속성을 제한하여
유도한 사용자 정의 데이터 타입을 정의 할 수 있도록 지원
• XML 스키마 장점
- XML 스키마는 XML 문법과 동일하여 따로 익힐 필요가 없음
- 다양한 기본 데이터 타입과 사용자 정의 데이터 타입 지원
- 높은 확장성과 재사용성
- XML 네임스페이스 지원
- DTD보다 더 복잡하게 섞인 내용 모델을 제한할 수 있음
DTD
XML Schema
문법
EBNF +
Pseudo XML
XML 1.0 스펙과
같음
내용 모델
약하다
강력
데이터 타입
String, name
Tokens, ID
String, numeric,
Data/time,
Structure
이름 공간
전역적인
이름들은 이용
전역, 지역적인
이름 모두 이용
객체 상속
제공하지 않음
제공함
확장성
제한적(MXL.1.0
스펙 변경)
제한적이지 않음
동적인 문서 구조
제공되지 않음
제공함
DOM 지원
지원하지 않음
지원함
DTD와 스키마 예제 비교
<students>
student.xml
<student>
<sno> s100</sno>
<name> 고소영 </name>
<age> 26 </age>
<phone>02-123-8989</phone>
<address> 서울 한남동</address>
</student>
</students>
student.dtd
<!ELEMENT students (student)*>
<!ELEMENT student (sno,name,age,phone,
address) >
<!ELEMENT sno (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="student">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="sno" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="xsd:string"/>
<xsd:element name="phone" type="xsd:string"/>
<xsd:element name="address" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
student.xsd
• DTD를 XML Schema로 변환
XML 스키마
DTD
<!ELEMENT>
<element/>
<!ATTLIST>
<attribute/>
,
<sequence> ...</sequence>
|
<choice> ... <choice>
+
minOccurs ="1" maxOccurs="unbounded"
?
minOccurs ="0" maxOccurs="1"
*
minOccurs ="0" maxOccurs="unbounded"
• XML 문서에 XML 스키마를 적용 예제
- XML 스키마를 선언할 때도 XML 문서에 스키마 파일 지정
- 네임스페이스를 사용하지 않는 스키마 파일은
“noNamespaceSchemaLocation” 속성을 이용해서 표현
- 사용 예
<student
xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xsi:noNamespaceSchemaLocation="student.xsd">
- 작성된 XML 스키마를 XML 문서에 적용하여 유효성 검증
• XML 스키마 데이터 타입
• 미리 정의된 데이터 타입 – 기본 데이터 타입
- 19개의 내장 원시 데이터 타입
- 문자열, 부호화된 이진, 숫자, 날짜/시간 데이터 타입
- 문자열 데이터 타입
string
유효한 문자열
anyURI
표준 인터넷 URI의 데이터 타입
NOTATION
외부의 비 XML 컨텐츠에 대한 링크를 선언
QName
"Namespace in XML"에 정의된 것에 적합한 QName 문자열
- 부호화된 이진 데이터 타입
boolean
true나 false 상태를 가지는 상태(flag)값을 가짐
hexBinary
일련의 16진수 숫자쌍으로 부호화된 이진 데이터 타입
base64Binary
base64로 부호화된 이진 데이터 타입
• 미리 정의된 데이터 타입 – 기본 데이터 타입
- 숫자 데이터 타입
decimal
십진수
float
4바이트 실수
double
8바이트 실수
- 날짜/시간 데이터 타입
duration
기간 표현
dateTime
날자와 시간 표현, 날자는 그레고리력 사용
date
날자 표현, yyyy-mm-dd 형태 표현
time
시간 표현
gYearMonth
그레고리력의 년과 월 표현, yyyy-mm 형태로 표현
gYear
그레고리력의 년 표현
gMonthDay
그레고리력의 월과 일 표현
gMonth
그레고리력의 월 표현
gDay
그레고리력의 일 표현
• 미리 정의된 데이터 타입 – 파생 데이터 타입
- 25개가 있음. String 파생 + decimal 파생 데이터 타입
- String 파생한 데이터 타입
normalizedString
각각의 공백 문자들이 하나의 스페이스 문자로 대치되어 있는 문자열
token
모든 공백문자가 단 하나의 스페이스들로 변환되어 있는 문자열, 앞뒤에 오는 스페
이스가 모두 제거되며 연속되는 스페이스 단 하나의 스페이스 문자로 대치.
language
자연 언어 식별 문자열
Name
ID
모든 적합한 XML1.0 이름
“Namespace in XML" 에 정의되어 있는 지역화되지 않은 적합한 XML 1.0 이름.
즉, ”:“이 없는 XML1.0 이름을 말한다.
연관된 요소를 식별하는 고유값
IDREF
ID 속성 값을 통한 다른 요소에 대한 참조.
IDREFS
IDREF 값으로 구성된 목록
NMTOKEN
적합한 XML 이름 문자들로 구성되어 있는 문자열, 하지만 XML 이름의 첫문자 제
한은 적용되지 않는다.
NMTOKENS
NMTOKEN 값들로 구성된 목록
ENTITY
적합한 NCName이 되는 문자열. DTD에 선언된 파싱되지 않는 개체
ENTITIES
ENTITY 값들로 구성된 목록
NCName
• 미리 정의된 데이터 타입 – 파생 데이터 타입
- decimal에서 파생한 데이터 타입
integer
소수점이 허용되지 않는 정수
negativeInteger
음의 정수
positiveInteger
양의 정수
nonNagativeInteger
0과 양의 정수
nonPositiveInteger
0과 음의 정수
byte
1바이트 정수
short
2바이트 정수
int
4바이트 정수
long
8바이트 정수
unsignedByte
부호 없는 1바이트 정수
unsignedShort
부호 없는 2바이트 정수
unsignedInt
부호 없는 4바이트 정수
unsignedLong
부호 없는 8바이트 정수
• XML 스키마 선언
- XML 스키마의 네임스페이스 속성을 설정하고 사용하기 위해서 선언
- 형식
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.dankook.ac.kr"
xmlns="http://www.mysite.com"
elementFormDefault="qualified"
attributeFormDefault="qualified">
......
</xsd:schema>
- XML 스키마 선언은 <xsd:schema> 요소로 시작
- 최상위 요소는 항상 schema
• XML 스키마 선언 속성
속성
설명
①xmlns:xsd
XML 스키마의 네임스페이스 지정
②targetNamespace
현재 스키마에서 선언된 요소의 네임스페이스 지정
③xmlns
기본 네임스페이스를 지정
④elementFormDefault
스키마를 사용하는 XML 문서에 대한 지시문
속성값이 qualified면 XML 문서에서 사용하는 모든 요소는
targetNamespace 에 서 선 언 된 네 임 스 페 이 스 를 사 용 해 야
하지만, unqualified일 경우는 targetNamespace에서 선언된
네임스페이스를 사용하지 않아도 된다.
⑤attributeFormDefault
속성에 대한 지시문
개념은 elementFormDefault 속성과 동일
• 기본 네임스페이스로 XML 스키마 선언
- XML 스키마와 관련된 요소에는 “xsd”라는 접두사를
사용하지 않아도 됨
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dankook.ac.kr"
xmlns:std="http://www.mysite.com"
elementFormDefault="qualified"
attributeFormDefault="qualified">
......
</schema>
• 요소 선언과 요소 타입 정의
- 요소 정의
<element
abstract = boolean : false
block = (#all | List of (extension | restriction | substitution))
default = string
final = (#all | List of (extension | restriction))
fixed = string
form = (qualified | unqualified)
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
name = NCName
nillable = boolean : false
ref = QName
substitutionGroup = QName
type = QName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, ((simpleType | complexType)?, (unique | key
| keyref)*))
</element>
• XML 스키마 요소 정의 요약
<xsd:element [이름] [참조] [타입] [최소반복횟수] [최대반복횟수]>
속성
이름
name
참조
reference
타입
type
설명
선언하려는 요소 이름을 정의
참조할 다른 요소 이름을 정의
요소 타입을 정의(기본 데이터 타입 또는 사용자 정의 데이
터 타입을 정의)
최소반복횟수
minOccurs
요소가 나타날 수 있는 최소 횟수를 정수로 정의
생략하면 기본값이 1로 지정
최대반복횟수
maxOccurs
요소가 나타날 수 있는 최대 횟수를 정수로 정의
생략하면 기본값이 1로 지정
• 단순 데이터 타입
- <simpleType> 요소 사용해서 정의
- XML 스키마에서 정의한 다른 단순 데이터 타입을 이용해서 정의 가능
- 내부에 다른 요소나 속성을 포함할 수는 없음
- restriction, list, union 이용해서 확장 가능
- simpleType 요소 정의 형식
<simpleType
final = (#all | (list | union | restriction))
id = ID
name = NCName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (restriction | list | union))
</simpleType>
• 제한 요소 정의와 사용
- 새로운 단순 데이터 타입은 기존의 단순 데이터 타입이 가질 수 있는
값의 범위를 제한해서 정의할 수 있다.
- restriction 요소 정의 형식
<restriction
base = QName
id = ID
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (simpleType?, (minExclusive
minInclusive |
maxExclusive | maxInclusive
totalDigits | fractionDigits | length | minLength
maxLength | enumeration | whiteSpace | pattern)*))
</restriction>
|
|
|
• 목록 요소 정의와 사용
- 개발자는 원하는 경우에 목록 요소를 이용해서 새로운 목록 타입을
정의 할 수 있음
- 목록 요소의 “itemType” 속성은 목록에서 사용할 수 있는
데이터 타입을 기술
- XML 스키마에서 목록 요소 정의 형식
<list
id = ID
itemType = QName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (simpleType?))
</list>
• 결합 요소 정의와 사용
- 주어진 여러 개의 단일 타입이나 목록 타입중에서 선택적으로 지정하여
결합해서 사용할 수 있는 방법
- <union> 요소를 이용해서 표현할 수 있으며, 사용할 수 있는 데이터
타입들은 “memberType” 속성을 이용해서 표현할 수 있다.
- 결합 타입을 정의하는 형식
<union
id = ID
memberTypes = List of QName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (simpleType*))
</union>
• 복합 데이터 타입
- 요소를 정의하고 사용하기 위해서 기본적으로 복합 데이터 타입
(complexType)을 정의해서 사용
- 자식 요소나 속성을 필요로 하는 요소를 정의하기 위해서는 복합 데이터
타입으로 정의
- 형식
<complexType
abstract = boolean : false
block = (#all | List of (extension | restriction))
final = (#all | List of (extension | restriction))
id = ID
mixed = boolean : false
name = NCName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (simpleContent | complexContent |
((group | all | choice | sequence)?, ((attribute |
attributeGroup)*, anyAttribute?))))
</complexType>
• 순차 요소 정의와 사용
- DTD의 컴마(,) 연산자에 해당
- 자식 요소들이 순서대로 나타나야 하는 경우 사용
 <sequence> 요소 : 발생 횟수 표현,
“maxOccurs” 와 “minOccurs” 속성을 가짐
기본값은 1로 사용
- 형식
<sequence
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (element | group | choice
sequence | any)*)
</sequence>
|
• 선택 요소 정의와 사용
- 선택은 여러 개의 자식 요소중에서 선택적으로 요소를 정의하는 것
- 자식 요소의 발생 횟수를 지정하기 위해서
“maxOccurs” 와 “minOccurs” 속성을 가지고 있음
- 형식
<choice
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (element | group | choice
sequence | any)*)
</choice>
|
• 그룹 요소 정의와 사용
- 여러 요소를 하나로 묶어 사용하기 위해 사용
- 형식
<group
name = NCName>
Content: (annotation?, (all | choice | sequence))
</group>
- 그룹 정의는 <group> 요소 내부에 정의
- 스키마 요소의 직계 자식인 전역으로 정의되어야 함
- <group> 요소에는 이름을 줄 수 있기 때문에 스키마의 어느 곳에서나
참조할 수 있고, 따라서 재사용 가능한 컨텐츠를 만드는데 그룹이 매우
유용하게 사용될 수 있음
- 속성인 all, choice, sequence 요소들은 <group> 요소 내부에 중첩
• 전체 요소 정의와 사용
- all 요소는 DTD에서 정의할 수 없었던 형식 제공
- <all> 요소는 자식 요소들의 순서에 관계 없이 나타날 수 있는 것을
표현하기 위해서 사용
- 형식
<all
id = ID
maxOccurs = 1 : 1
minOccurs = (0 | 1) : 1
{any attributes with non-schema namespace . . .}>
Content: (annotation?, element*)
</all>
• 속성 선언
- 속성은 어떤 자식 정보 항목도 포함할 수 없음
(복합데이터 타입으로 정의할 수 없음)
- 속성은 순서가 없음
- 형식
<attribute
default = string
fixed = string
form = (qualified | unqualified)
id = ID
name = NCName
ref = QName
type = QName
use = (optional | prohibited | required) : optional
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (simpleType?))
</attribute>
• 속성 그룹 정의
- 속성 선언들을 그룹으로 묶어서 이름을 지정해 주는 것
- 여러 요소가 동일한 속성 집합을 지니고 있을 때 유용
- 형식
<attributeGroup
id = ID
name = NCName
ref = QName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, ((attribute | attributeGroup)*,
anyAttribute?))
</attributeGroup>
- 속성 그룹은 반드시 <attributeGroup> 요소를 사용하여
전역으로 정의
• XML 스키마 주석
- <annotation> 요소의 자식 요소인 <documentation> 요소와
<appinfo> 요소를 이용해서 정의
- <documentation> 요소
 자신뿐만 아니라 다른 사람이 문서 의도와 목적을 이해하는데
도움이 되는 정보를 수록
- <appinfo> 요소
 처리 애플리케이션에 대한 추가적인 정보 제공
• XML 스키마 주석 형식
<annotation
id = ID
{any attributes with non-schema namespace . . .}>
Content: (appinfo | documentation)*
</annotation>
<appinfo
source = anyURI>
Content: ({any})*
</appinfo>
<documentation
source = anyURI
xml:lang = language>
Content: ({any})*
</documentation>
• XML 스키마 작성 규칙
1
DTD와 달리 항상 별도의 파일로 저장
2
XML 스키마 파일의 확장자는 “.xsd”
3
Schema 문서 구조는
<element>,<complexType>,<sequence>등과
같은 요소를 사용
4
요소나 속성 값을 지정하기 위해서는
type=“string” 같은 데이터 타입 지정자를 사용
5
XML 스키마 문서는 XML 문서이어야 함
• XML 스키마 예제 (메모.xsd)
• XML 스키마 예제 (메모.xml)