1. XML 스키마의 개요
1.1 개발 배경 및 목표
XML DTD는 SGML 시절부터 널리 사용되고 있던 DTD의 형태와 개념을 가져와서 XML에 적용시켰기 때문에 XML 스펙이 발표된 이후 차례차례 발표된 XML 관련 기술 표준들에 대한 지원이 미흡하다. XML 스키마는 이러한 DTD의 한계와 더 효율적인 XML 활용을 위하여 시작된 표준화 작업이며, W3C의 XML 스키마 워킹 그룹(Schema Working Group)은 개발자에서 컨텐츠 설계자에 이르기까지 다양한 사용자의 욕구를 만족할 수 있는 스키마 스펙을 만들기 위해 노력했다. 이러한 노력의 결과가 바로 XML 스키마로, 1999년 2월에 발표되고, 2001년 5월에 정식 권고안이 되었다.
W3C의 XML 스키마 워킹 그룹은 XML 문법으로 작성할 수 있는 DTD보다 강력한 표현이 가능한 스키마 언어를 만드는 것이 목적이었다.
[스키마 언어 설계 목표] |
1. DTD에 비해서 문서 클래스에 대해 더욱 강력한 또는 느슨한 제한을 허용한다. 2. 여러 개의 네임스페이스에 속한 마크업으로 구성한 문서에 대해서도 유효성을 검증할 수 있다. 3. 엘리먼트, 속성 및 데이터 타입 정의를 상속할 수 있는 방법을 제공한다. 상속한 엘리먼트 사이는 명시적으로 kind-of 관계로 나타낼 수 있다. 예를 들면 자동차는 탈 것의 한 종류이므로 kind-of 관계로 나타낼 수 있다. 즉, 이러한 개념은 기존의 객체지향 설계 방법을 많이 반영하고 있다. 4. SQL과 자바와 같은 언어에서 볼 수 있는 byte, date, integer와 같은 기본 데이터 타입을 지원한다. 5. XML을 관계형, 객체, OLAP 데이터베이스로 가져오거나 내보내는 것을 지원하기 위한 형식 체계에 대한 정의를 지원한다. 6. 기존 데이터 타입의 범위, 길이와 같은 특정 속성을 제한하여 유도한 사용자 정의 데이터 타입(UDT, User Defined data Type)을 정의할 수 있게 지원한다. |
1.2 XML 스키마의 특징 및 DTD와의 비교
원래 스키마라는 용어는 XML에서만 특별히 사용되는 용어는 아니다. 전산 분야에서 스키마는 일반적으로 데이터베이스의 조직 또는 구조를 의미한다. XML에서의 스키마 역시 조직 또는 구조라는 의미를 지니며 DTD와 함께 문서의 구조를 정의하기 위해 제안된 기술이다. DTD는 몇 가지 한계점을 지님으로써 XML 문서 구조를 정의하기 위한 새로운 규칙의 필요성이 대두되었다.
[DTD의 몇 가지 한계점] |
1. DTD는 XML 문법이 아닌 EBNF 문법 형식을 따른다. 따라서 작성 방법을 별도로 익혀야 하는 번거로움이 있다. 2. DTD는 재사용성과 확장성이 떨어진다. DTD는 한번 만들면 읽기만 가능할 뿐 수정은 쉽지 않다. 따라서 확장은 물론, 전체를 사용하는 경우가 아니라면 재사용하기가 쉽지 않다. 3. DTD는 제한적인 데이터 타입만을 지원한다. 문자열 이외에 데이터 타입이 아닌 숫자, 날짜 구별이나 값의 범위, 패턴 등을 체크할 수 없다. 즉, 제한한 데이터 타입만으로는 문서의 내용을 좀더 정확하게 표현하는 것이 어렵다. |
그렇다면 DTD를 사용하여 문서를 작성할 때와 비교하여 XML 스키마가 가지는 특징 및 장점에 대하여 살펴보자.
[ DTD와 XML 스키마의 특징 비교 ]
DTD | XML 스키마 |
문법 : SGML 문법 준수 | 문법 : XML 문법 준수 |
네임스페이스 지원하지 않음 | 네임스페이스 지원함 |
단순한 텍스트 데이터 형식 지원 | 다양한 빌트인 데이터 형식과 사용자 지정 데이터 형식을 지원 |
반복 연산자 : 0회, 1회, n회 반복 지원 | 반복 연산자 : 최소 및 최대 반복 횟수를 다양하게 지정 가능 |
XML 1.0에서 제정 | XML 2.0에서 제정 |
익스플로러 4.0부터 도입 | 익스플로러 5.0부터 도입 |
확장자 DTD | 확장자 XSD |
엘리먼트, 속성 등의 지원 기능이 미흡 | 엘리먼트, 속성 등의 지원 기능이 가능 |
데이터의 정렬이 어려움 | 데이터의 정렬이 가능 |
첫째로, XML 스키마는 DTD와 달리 XML 문법에 의거하여 작성되며 XML 네임스페이스와 결합하여 사용한다. 따라서 특별한 구문을 배울 필요가 없으며 XML을 사용하기 위해 개발된 도구들을 그대로 사용할 수 있다는 이점이 있다.
둘째로, DTD에서 지원되는 데이터 형식이 단순한 텍스트 형식이었던 것에 반해 XML 스키마에서 지원되는 데이터 형식은 텍스트 형식뿐만 아니라 부울형, 숫자형, 실수형, 시간 표현, 날짜 표현 등 수십 가지 종류의 자료형(데이터 타입)을 지원하여 문서에 대해 보다 세세한 유효성 검증을 수행할 수 있게 하고 데이터 처리시 고유의 타입을 유지할 수 있다. 특히, DTD에서 제공되는 제한된 데이터 타입만으로는 데이터베이스 시스템에 매끄럽게 연계시키기 어려웠기 때문에 다양한 데이터 타입을 지원하는 XML 스키마에 이목이 집중되었다.
셋째로, 엘리먼트가 문서 내에서 몇 회 반복되는지를 나타내기 위해 사용하는 반복 연산자의 경우, DTD에서는 반복 회수에 대한 세세한 제어를 해 줄 수 없는 반면, XML 스키마에서는 엘리먼트에 대한 최소 반복 횟수와 최대 반복 횟수의 지정이 가능하기 때문에 “0회 또는 15회 반복”과 같이 지정하는 것이 가능하다.
넷째로, XML 스키마에는 확장성이 존재한다. 다른 스키마에서 정의되어 있는 내용의 일부를 재사용할 수도 있고 내가 작성하는 스키마를 다른 스키마에서 재사용할 수 있도록 구조화시킬 수도 있다. 그리고 스키마에서 제공하는 자료형의 경우 스펙에서 제시하고 있는 빌트인 자료형 이외에도 이를 바탕으로 하는 사용자 정의 자료형의 정의도 가능하다. 또한 하나의 문서에 대하여 다중 스키마를 참조할 수 있다.
마지막으로, XML 코드를 문서화하기 위한 몇 가지 메커니즘을 제공하고 있어서 XML 문서를 더욱 효과적으로 생성할 수 있다. XML 스키마는 일반적으로 사용되는 주석문을 지원할 뿐 아니라 XML 스키마 문서 내의 모든 엘리먼트들이 다른 네임스페이스에 속하는 속성을 가질 수 있기 때문에 엘리먼트에 대한 설명을 담기 위한 목적으로 속성을 사용할 수 있다. 그리고 주석(Annotation)이라는 것을 지원하여 문서화를 위한 정보의 기술 및 애플리케이션에 필요한 정보를 제공할 수 있다.
1.3 XML 스키마의 표준화
XML 스키마는 DTD와 유사한 목적을 위해 설계된 기술이다. 즉, 문서의 형식을 구조화하여 표현하고자 제안된 기술인데, W3C에서 XML 스키마라는 명칭으로 표준화를 진행하기 이전에도 DTD를 대신할 스키마들이 많이 존재하고 있었다. 대표적인 스키마 기술로써 마이크로소프트사의 XML-Data(현재 XML-Data Reduced), IBM사와 마이크로소프트사가 합작하여 개발한 DCD(Document Content Description), B2B 분야의 선두 기업인 CommerceOne에서 개발한 SOX(Schema for Objeect-Oriented XML), XML.ORG 및 OASIS에서 주관하고 자체적으로 조정된 포럼인 XML-Dev에서 제안된 DDML (Document Definition Markup Language) 등이 있으며 이외에도 Schematron, DSD, RELAX 등 다양한 종류의 스키마 기술이 만들어졌다. 하지만, 각 기업 또는 기관에서 필요에 의하여 만들어 낸 스키마들 사이에는 호환성이 존재하지 않기 때문에 공통된 스키마의 필요성을 느끼게 되었고 W3C에서 XML 스키마라는 명칭으로 스키마를 표준화하여 2001년 5월 XML 스키마 1.0을 권고안(Recommendation)으로 발표하게 되었다.
현재 W3C에서 권고안으로 발표한 XML 스키마 1.0은 크게 세 부분으로 구성되어 있으며, 각각의 명칭은 다음과 같다.
XML 스키마 Part 0 : Primer
XML 스키마 Part 1 : Structures
XML 스키마 Part 2 : Datatypes
Part 0 : Primer는 비 표준화 문서(Non-Normative Document)로써 XML 스키마의 특성에 대한 이해를 돕기 위하여 만들어진 문서이다. 문서 내용은 W3C의 XML 스키마가 무엇인지, DTD와 어떤 차이점이 있는지, XML 스키마 언어를 사용하여 어떻게 스키마를 작성할 것인지 등의 튜토리얼 형식의 내용을 다루고 있다.
Part 1 : Structures는 새로운 XML 문법을 사용하여 지켜야 할 XML 문서의 내용과 구조에 관한 표준화 문서(Normative Document)이다. 문서 내용은 스키마 유효성을 결정하기 위한 규칙에 관한 정의와 엘리먼트, 속성, 노테이션 등에 대한 정의를 다루고 있다.
Part 2 : Datatypes는 XML 엘리먼트 콘텐츠와 속성값에 관련된 데이터타입의 집합을 정의하고 있는 표준화 문서이다. 문서 내용은 빌트인 데이터타입과 사용자 정의 데이터타입의 집합에 대하여 다루고 있다.
참조 사이트 [W3C XML Schema] http://www.w3c.org/XML/Schema [XML Schema Part 0: Primer] http://www.w3.org/TR/xmlschema-0/ [XML Schema Part 1: Structures] http://www.w3.org/TR/xmlschema-1/ [XML Schema Part 2: Datatypes] http://www.w3.org/TR/xmlschema-2/ |
2. 스키마 문서의 물리적 구성
2.1 주 스키마 문서 및 외부 스키마 문서
마크업 언어에 대한 정의를 담고 있는 스키마 문서는 XML 문서와는 별도로 “xsd” 확장자를 가진 XML 문서로 작성된다.
마크업 언어에 대한 정의는 주 스키마 문서 하나로 작성될 수도 있고, 주 스키마 문서 한 개와 주 스키마 문서에 포함이 되는 여러 개의 외부 스키마 문서로 작성될 수도 있다.
보통 스키마 문서는 인터넷상의 접속 가능한 웹 서버에 위치하게 되는데, XML 문서는 웹 서버의 주소를 포함한 스키마 문서의 URL을 루트 엘리먼트에 명시하여, XML 파서가 유효성 판단을 할 수 있도록 해야 한다.
2.2 스키마 문서의 작성에서부터 사용까지
그림 4-2는 스키마 문서의 작성에서부터 사용하기까지의 과정을 도식화한 것이다.
상기 그림에 대한 과정 설명은 다음과 같다.
1) 마크업 언어 개발자는 새로운 마크업 언어를 스키마 문서에 정의한다.
2) 개발된 마크업 언어가 정의된 스키마 문서를 웹 서버에 저장한다.
3) 스키마 문서가 필요한 곳에서 참조하거나 다운로드한다.
4) 문서 작성자는 스키마 문서에 정의되어 있는 구조로 XML 문서를 작성한다.
5) 이렇게 작성된 XML 문서는 네트워크를 통해 정보 전달의 수단이 된다.
6) 네트워크를 통해 전달된 XML 문서는 응용프로그램에 의해 유효성 검사를 받게 되고, 응용프로그램이 처리할 수 있는 구조로 되어 있으면 용도에 맞게 처리된다.
2.3 스키마 인스턴스 지정 방법
스키마 문서에 정의된 구조대로 작성된 XML 문서를 스키마 인스턴스(Schema instance)라고 부른다. 그리고 XML 문서는 특정 스키마 문서에 정의된 구조를 따르고 있다는 것을 루트 엘리먼트에 명시해야만 해당 스키마 문서의 인스턴스로 파서가 인식할 수 있고 유효성 검사도 할 수 있게 된다.
다음은 XML 문서가 특정 스키마 인스턴스라는 것을 파서에게 알려주는 문법이다.
<?xml version="1.0" encoding="euc-kr"?> <루트엘리먼트 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="스키마 문서 URI"> </루트엘리먼트> |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 구문은 스키마 인스턴스에 대한 네임스페이스 선언인데 대소문자를 정확히 입력해야 한다.
그리고 xsi:noNamespaceSchemaLocation 속성값으로는 스키마 문서의 URI 경로를 명시해 주면된다. 보통은 웹 서버상에 스키마 문서가 있으므로 다음과 같은 형태로 경로를 지정해 주면된다.
xsi:noNamespaceSchemaLocation="http://웹서버 주소/경로//스키마 문서 파일명" |
만약에 인터넷이 연결되어 있지 않는 환경에서 테스트 용도로 XML 문서의 유효성을 판단할 목적이라면, 스키마 문서 경로에 스키마 문서 파일명만 언급할 수도 있다. 이것은 XML 문서가 저장되어 있는 로컬 하드디스크와 동일할 디렉토리에 위치한 스키마 문서를 기준으로 작성되었다는 뜻이다.
xsi:noNamespaceSchemaLocation="스키마 문서 파일명" |
3. 스키마 인스턴스의 유효성 검사
3.1 유효성 검사의 필요성
XML 문서(스키마 인스턴스)가 해당 스키마 문서에 정의되어 있는 구조대로 작성되었는지 검사하는 것을 유효성 검사라고 한다. 유효성 검사 결과 이상이 없는 XML 문서를 해당 스키마 문서에 대한 유효한 문서라고 부른다.
유효성 검사는 XML 문서를 작성하는 쪽과 XML 문서를 처리하는 쪽, 모두 실시할 필요성이 있다. XML 문서를 작성하는 쪽은 XML 문서가 잘 작성되었는지 확인할 목적으로 유효성 검사를 한다. 또한 XML 문서를 처리하는 쪽은 해당 XML 문서가 잘 처리될 수 있을 것인지 검증하기 위해 유효성 검사를 하게 된다.
3.2 XML 문서 작성 시의 유효성 검사
보통 XML 문서를 작성하는 쪽은 사람 또는 응용프로그램이다. 응용프로그램에서 자동적으로 XML 문서를 작성할 경우에는 스키마 구조에 맞게 작성하도록 이미 프로그래밍되어 있기 때문에 정확한 XML 문서가 만들어지겠지만, 사람이 수작업으로 XML 문서를 작성할 경우에는 반드시 유효성 검사를 해서 잘 작성되었는지 확인해야 한다.
XML 문서 작성자는 유효성 검사를 직접 확인하면서 작성할 수도 있지만, 유효성 검사를 하는 프로그램을 사용하는 것이 일반적이다. 이 프로그램을 검증기(Validator)라고 부른다.
3.3 XML 문서 처리 시의 유효성 검사
XML 문서를 처리하는 쪽은 응용프로그램이다. 응용프로그램은 로컬 영역에 파일 형태로 존재하는 XML 문서와 네트워크를 통해 전달되는 XML 문서를 읽고 적절히 처리하는 프로그램이다.
응용프로그램이 XML 문서를 처리하는 과정에 들어가기 전에 반드시 자기가 처리할 수 있는 구조로 되어 있는지 유효성 검사를 해야 한다. 만약 다른 구조로 작성되어 있다면 응용프로그램 처리 과정에서 문제가 발생할 것이다
.
4. XML 스키마 구조
XML 스키마 문서 자신도 XML 문서이며, 스키마 문서의 루트 엘리먼트는 <schema>라는 엘리먼트를 사용해야 한다. 그리고 모든 스키마 언어의 엘리먼트 및 빌트인 데이터타입들은 다음과 같은 네임스페이스를 사용해야 한다. 관례적으로 스키마 엘리먼트에 대한 네임스페이스 접두사로는 xsd를 많이 사용한다.
xmlns:xsd="http://www.w3.org/2001/XMLSchema" |
한편, 루트 엘리먼트의 자식 엘리먼트들은 크게 두 개의 파트로 나눌 수 있다.
<?xml version="1.0" encoding="euc-kr"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 외부 XML Schema 문서의 참조에 관련된 엘리먼트 새로운 엘리먼트 및 속성을 선언하는 엘리먼트 </xsd:schema> |
[예] 일기(diary) 작성을 위한 실제 스키마 문서의 정의
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="diary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="date" /> <xsd:element ref="event" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="date" type="xsd:date" /> <xsd:element name="event"> <xsd:complexType mixed="true"> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="book" /> </xsd:choice> </xsd:complexType> </xsd:element> <xsd:element name="book"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attributeGroup ref="book.attlist"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <xsd:attributeGroup name="book.attlist"> <xsd:attribute name="isbn" type="xsd:string" use="required" /> <xsd:attribute name="status" type="bookStatusType" use="optional" /> </xsd:attributeGroup> <xsd:simpleType name="bookStatusType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="read" /> <xsd:enumeration value="purchase" /> <xsd:enumeration value="wish" /> </xsd:restriction> </xsd:simpleType> </xsd:schema> |
외부 스키마 문서 참조에 관련된 엘리먼트로 다음과 같은 것들이 있다.
<include> 엘리먼트
<import> 엘리먼트
<redefine> 엘리먼트
새로운 엘리먼트 및 속성 선언과 관련된 엘리먼트로 다음과 같은 것들이 있다.
<element> 엘리먼트
<attribute> 엘리먼트
<simpleType> 엘리먼트
<complexType> 엘리먼트
<group> 엘리먼트
<attributeGroup> 엘리먼트
<notation> 엘리먼트
<annotation>엘리먼트
외부 스키마 문서 참조에 관련된 엘리먼트는 반드시 엘리먼트 및 속성 선언과 관련된 엘리먼트 이전에 작성되어야 한다.
5. 자료형의 기본 지식
XML 스키마에는 속성뿐만 아니라 엘리먼트에도 자료형을 지정할 수 있다. DTD의 속성에 사용하는 것과 같은 ID형이나 NMTOKEN형 이외에 날짜와 시간 그리고 수치형을 비롯하여 데이터베이스와 자바 등의 프로그래밍 언어에서 자주 사용되는 자료형이 제공되고 있다.
또한, 미리 정의된 자료형을 바탕으로 새로운 자료형을 작성하는 것이 가능하며, 새롭게 작성된 자료형을 파생 자료형(derived datatype)이라고 부른다.
5.1. 단순형과 복합형
XML 스키마의 자료형은 단순형(Simple Type)과 복합형(Complex Type)으로 구분된다. 단순형은 자식 엘리먼트나 속성이 없는 자료형으로, simpleType을 사용해서 정의한다. 속성은 모두 단순형이다. 반면 복합형은 자식 엘리먼트나 속성을 가질 수 있는 자료형으로, complexType을 사용해서 정의한다. 또한 빈 엘리먼트도 복합형이 된다. 단순형과 복합형에 대한 자세한 내용은 다음 강의에 다룬다.
5.2 자료형의 이름
자료형에는 이름을 붙이는 것이 가능하다. 예를 들어 author 엘리먼트와 editor 엘리먼트의 자료구조가 동일한 것이라면 공통적으로 사용하는 person형을 정의해 두는 것이 편리하다. 엘리먼트나 속성을 그룹화해서 이름을 붙이는 것도 가능하다. 또한 자료형에 이름을 붙여 놓으면 “person형을 기반으로 새로운 personGroup형을 만든다”는 것도 가능하다.
이름이 없는 자료형을 익명 자료형(anonymous datatype)이라고 부른다. 예를 들어 아래의 예에서는 자료형을 선언하지 않았다. 이것이 바로 익명 자료형이다.
* 익명 자료형에 의한 정의
<xsd:element name="diary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="date" /> <xsd:element ref="event" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> |
이와 같은 자료형에 diaryType이라는 이름을 붙여서 다음과 같이 정의할 수 있다.
* 자료형에 이름을 붙여서 정의한 경우
<xsd:element name="diary" type="diaryType"> <xsd:complexType name="diaryType"> <xsd:sequence> <xsd:element ref="date" /> <xsd:element ref="event" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> |
5.3 이미 정의된 자료형
XML 스키마에는 date형(날짜,시간), boolean형, integer형, float형 등의 자료형이 빌트인 자료형으로 미리 정의되어 제공된다.
이미 정의된 자료형의 주요한 것들에는 다음과 같은 것들이 있다.
string | 문자열 [string형으로부터 파생된 자료형] normalizedString, token, language, Name, NCName, NMTOKEN, NMTOKENS ID, IDREF, IDREFS, ENTITY, ENTITIES |
QName | 접두사가 붙은 이름 |
anyURI | URI |
boolean | 부울형 |
decimal | 정수 [decimal으로부터 파생된 자료형] integer, long, int, short, byte negativeInteger, positiveInteger, unsignedLong, unsignedInt, unsignedShort, unsignedByte |
float | 부동소수점 (IEEE 단정도 32비트) |
double | 부동소수점 (IEEE 배정도 64비트) |
hexBinary | 16진수 |
dateTime | 날짜시간 (CCYY-MM-DDThh:mm:ss) |
date | 날짜 (CCYY-MM-DD) |
time | 시간 (hh:mm:ss.sss) |
duration | 경과된 시간 |
참조 사이트 [XML Schema Part 2: Datatype3 Built-in datatypes] http://www.w3.org/TR/xmlschema-2/#built-in-datatypes |
6. 엘리먼트
엘리먼트는 element로 정의한다. 이것을 엘리먼트 선언이라고 한다. 주요 선언 형식은 다음과 같으며, 각각의 엘리먼트에는 출현 회수 및 초기값을 지정할 수 있다.
* 엘리먼트 선언 형식
1. 이름과 자료형을 지정하는 경우 <xsd:element name="엘리먼트명" type="자료형" /> 2. 다른 곳에서 지정된 것을 참조하는 경우 <xsd:element ref="엘리먼트명" /> 3. 익명 자료형을 사용하는 경우 <xsd:element name="엘리먼트명"> ... 자료 구조 정의 ... </xsd:element> |
6.1 이름과 자료형에 의한 선언
name= 에 엘리먼트 이름을, type= 에는 자료형을 지정한다. 자료형에는 빌트인 자료형 이외에 사용자가 정의한 자료형도 사용할 수 있다. 자료형에 anyType을 지정하는 경우에는 모든 엘리먼트와 속성이 사용 가능하다.
* 이름과 자료형에 의한 선언의 예
<xsd:element name="title" type="titleType" /> title 엘리먼트는 사용자가 정의한 titleType형이다 <xsd:element name="date" type="xsd:date" /> date 엘리먼트는 date형이다 <xsd:element name="event" type="xsd:anyType" /> event 엘리먼트는 어떤 엘리먼트나 속성도 사용 가능한 anyType형이다 |
6.2 참조에 의한 선언
다른 정의를 참조하는 경우에는 ref= 을 이용해서 참조하는 곳의 이름을 지정한다. 주요 자식 엘리먼트나 속성을 선언할 때 사용한다.
* 참조에 의한 선언의 예
<xsd:element name="diary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="date" /> <xsd:element ref="event" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="date"> ... </xsd:element> <xsd:element name="event"> ... </xsd:element> |
6.3 익명 자료형에 의한 선언
자료형을 지정하지 않고 엘리먼트 선언 부분에 자료의 구조를 정의하는 것도 가능하다. 내용이 문자 데이터(#PCDATA)뿐으로 자식 엘리먼트나 속성이 없는 경우는 단순형(simpleType)으로서, 자식 엘리먼트나 속성이 있는 경우나 빈 엘리먼트가 사용되는 경우는 복합형(complexType)으로 정의한다.
* 익명 자료형에 의한 선언의 예
<xsd:element name="title"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="20" /> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="cd"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attributeGroup ref="cd.attlist"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> |
6.4 초기값과 출현회수
엘리먼트에는 초기값과 출현회수를 지정할 수 있다.
6.4.1 초기값
XML 스키마에서는 속성뿐만 아니라 엘리먼트에도 초기값이나 고정된 값을 지정할 수 있다. 초기값은 default=, 고정값은 fixed=를 사용해서 지정한다.
* 초기값 지정의 예
<xsd:element name="title" type="xsd:string" default="어느겨울날의일기" /> |
6.4.2 출현회수
minOccurs=와 maxOccurs=를 사용해서 엘리먼트의 출현회수를 지정할 수 있다. 예를 들어, 최저 2회, 최고 5회를 지정하고 싶은 경우에는 minOccurs="2" maxOccurs="5"로 한다. 지정하지 않는 경우에는, minOccurs="1"이고 또 maxOccurs="1", 즉 1회 출현을 의미한다.
* 출현회수 지정의 예
<xsd:element name="diary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="date" /> <xsd:element ref="event" maxOccurs="unbounded" /> <xsd:element ref="memo" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> |
7. 속성
속성은 attribute로 정의한다. 이것을 속성 선언이라고 한다. 속성도 엘리먼트와 마찬가지로 자료형에 의한 선언, 참조에 의한 선언, 익명 자료형에 의한 선언이 가능하다.
속성과 엘리먼트를 결부시키기 위해서는 element 엘리먼트 내에 직접 선언하는 방법 또는 속성 그룹을 사용하는 방법을 사용한다.
* 속성 선언 형식
1. 이름과 자료형을 지정하는 경우 <xsd:attribute name="속성명" type="자료형" /> 2. 다른 곳의 정의를 참조하는 경우 <xsd:atribute ref="속성명" /> 3. 익명 자료형을 사용하는 경우 <xsd:attribute name="속성명"> .... </xsd:attribute> |
7.1 속성의 유형
DTD에서는 속성의 유형으로 ID형, ENTITY형, 열거형 등을 사용할 수 있다. XML 스키마에서는 DTD에서 사용할 수 있는 자료형을 비롯하여 수치형, 날짜시간형을 사용할 수 있다. 또한 엘리먼트 선언과 마찬가지로 익명 자료형에 의한 선언도 가능하다. 단, 속성에 사용할 수 있는 것은 단순형뿐이다.
실제 정의를 살펴보자, 이것은 date 엘리먼트를 정의하고 있다. date 엘리먼트에는 weather 속성이 있고, "맑음", "흐림", "비"의 세 가지 값 중에서 하나의 값을 취할 수 있다.
* 속성의 유형을 지정한 경우의 예
<xsd:element name="date"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:date"> <xsd:attribute name="weather" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="맑음" /> <xsd:enumeration value="흐림" /> <xsd:enumeration value="비" /> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> |
7.2 초기값과 출현회수
속성에는 초기값과 출현회수를 지정할 수 있다. XML에서는 “하나의 엘리먼트에는 같은 이름의 속성은 하나만 사용할 수 있다”라는 제한이 있기 때문에 속성의 출현회수는 0 또는 1회로 제한된다.
7.2.1 초기값
속성의 초기값은 default=로, 고정값은 fixed=로 지정한다.
* 초기값 지정의 예
<xsd:attribute name="status" type="xsd:string" default="read" /> |
7.2.2 출현회수
속성에는 use=를 사용해서 출현회수를 지정할 수 있다. 1회 반드시 나타나야하는 경우에는 required, 임의(0회 또는 1회)의 경우에는 optional로 값을 지정한다. 이밖에 use="prohibited"으로 지정하는 경우에는 출현회수를 0회, 즉 사용금지로 지정하는 경우가 된다. 이것은 주로 파생형에서 기저형(base type)의 엘리먼트에서 지정되어 있는 속성을 제거하고 싶은 경우에 사용한다.
예를 들어, book 엘리먼트에는 isbn과 status 속성이 있고, 그것들의 출현회수가 각각 1회와 0회 또는 1회로 제한하는 경우에는 다음과 같이 정의한다.
* 출현회수 지정의 예
<xsd:element name="book> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="isbn" type="xsd:string" use="required" /> <xsd:attribute name="status" type="xsd:string" use="optional" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> |
7.3 속성 그룹
attributeGroup을 사용해서 속성 그룹을 작성할 수 있다. 같은 속성을 여러 엘리먼트에서 사용하는 경우에는 편리하다. 또한 엘리먼트를 선언하고 있는 중에 속성을 선언하는 경우에 속성을 그룹을 사용하는 선언하면 읽기 쉬워지는 이점이 있다.
앞서 살펴본 엘리먼트의 정의를 속성 그룹으로 바꿔서 정의하면 다음과 같이 표현할 수 있다.
* 속성 그룹의 작성 예
<xsd:element name="book> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attributeGroup ref="book.attlist /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <xsd:attributeGroup name="book.attlist"> <xsd:attribute name="isbn" type="xsd:string" use="required" /> <xsd:attribute name="status" type="xsd:string" use="optional" /> |
8. 주석
8.1 주석
XML 스키마는 두 종류의 주석을 제공하는데, 둘 다 <annotation> 엘리먼트의 자식 엘리먼트로 정의한다. <documentation> 엘리먼트는 다른 프로그램에서 주석을 넣는 것과 비슷하다. <documentation> 엘리먼트를 사용하여 우리 자신뿐 아니라 다른 사람들이 우리의 문서가 의도하고 있는 목적을 이해하기 쉽게 도와주는 정보를 넣을 수 있다. <appinfo> 엘리먼트는 처리 애플리케이션에 대한 추가적인 정보들을 제공할 수 있게 한다. 모든 분야의 프로그래밍과 마찬가지로 주석을 쓰는 것은 매우 중요하다. 만약, 다른 사람이 우리의 스키마를 사용하게 할 생각이라면 엘리먼트나 형식에서 의도한 목적을 명확하게 하기 위해 주석을 통해 충분한 정보를 제공해야만 한다. 또한 부가적인 정보는 사용자들이 스키마를 더 빨리 이해할 수 있게 해 줄 것이다. DTD 작성에서는 XML 문서에서 사용하는 것과 동일한 문법을 사용하여 다음과 같이 주석을 달 수 있었다.
<!-- XML 주석입니다. --> |
물론, XML 스키마 자체가 XML 문서이기 때문에 이러한 형태의 주석을 포함할 수도 있다. 그러나 다음과 같은 이유 때문에 이것은 좋은 문서화 방법이 아니라고 할 수 있다.
<documentation> 엘리먼트를 이용하여 문서화를 하면 XHTML과 같은 마크업을 사용하여 구조적인 문서화를 할 수 있지만 XML 주석은 그렇게 하지 못한다.
문서화에 스타일시트를 추가하여 스키마를 쉽게 자기 문서화(self-documentation)하도록 할 수 있다.
XML 파서는 주석을 무시할 수 있다. 하지만 명시적인 <documentation> 엘리먼트를 제공함으로써 어떤 처리 애플리케이션이라도 이 정보를 이용할 수 있게 만들 수 있다. 처리 애플리케이션이 저작 도구라면 마크업이 의도한 대로 쓰일 수 있게 <documentation> 엘리먼트로부터 정보를 전달해 줄 수도 있다.
<annotation> 엘리먼트는 스키마 구성의 맨 처음에 쓰일 수 있지만 대부분의 경우 <element>, <attribute>, <simpleType>, <complexType>, <group> 엘리먼트 안에 자주 사용한다. 문서화를 적용할 스키마 구성 엘리먼트에 <annotation> 엘리먼트를 만들어 주고 그 자식으로 <documentation> 엘리먼트를 넣어 사용하면 된다.
8.2 annotation 엘리먼트
<annotation> 엘리먼트를 사용하여 주석을 기술하면 응용프로그램에서 스키마 문서를 읽어서 처리할 때 이 주석의 내용을 유용하게 활용할 수 있다.
<annotation> (appinfo | documentation)* </annotation> |
8.2.1 appinfo 엘리먼트
스키마 주석의 최상위 엘리먼트인 <annotation> 엘리먼트의 자식인 <appinfo> 엘리먼트는 처리 애플리케이션이나 스타일시트 또는 다른 도구에 정보를 전달할 목적으로 설계했다. 이것은 XML 스키마 호환 파서가 애플리케이션에 정보를 전달하는 방법을 구현하기 때문에 스키마 사용자에게 편리를 제공한다.
<appinfo> 엘리먼트는 XML 스키마에서 모두 <annotation> 엘리먼트 안에 포함하고, <documentation> 엘리먼트와 동일한 규칙을 갖는다. 이것은 이 엘리먼트를 대부분의 스키마 구성에서 사용할 수 있다는 것을 의미한다.
<appinfo> 엘리먼트는 XML 문서의 내용을 처리하는 응용프로그램을 위한 주석 부분으로 사용된다. source 속성에는 외부 참고 문서를 기술할 수 있다. 보통 source 속성은 생략된다.
<appinfo source="외부 문서 참조 경로"> 주석 내용 </appinfo> |
[예] <appinfo> 엘리먼트를 사용한 스키마 문서
<?xml version="1.0" encoding="euc-kr"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:appinfo> XML WebService 2.0 </xsd:appinfo> </xsd:annotation> </xsd:schema> |
<appinfo> 엘리먼트의 컨텐츠인 문자 데이트를 처리하는 것은 응용프로그램의 몫으로, 버전에 따라 스키마 인스턴스인 XML 문서를 달리 처리할 경우 유용하게 사용할 수 있을 것이다.
8.2.2 documentation 엘리먼트
<documentation> 엘리먼트는 응용프로그램을 위한 주석이라기 보다는 사람이 읽기 위한 서술형 주석으로 사용된다. source 속성에는 외부 참고 문서를 기술할 수 있고 xml:lang 속성에는 주석에 사용되어진 언어를 기술해 주면 된다. 보통은 source 속성 및 xml:lang 속성은 생략된다.
<documentation source="외부 참조 문서 경로" xml:lang="사용된 언어"> 주석 내용 </documentation> |
[예] <documentation> 엘리먼트를 사용한 스키마 문서.
<?xml version="1.0" encoding="euc-kr"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:appinfo> BML 2.0 </xsd:appinfo> <xsd:documentation> BML 1.0을 업그레이드 </xsd:documentation> </xsd:annotation> </xsd:schema> |
정리
1. XML 문법으로 작성할 수 있는 DTD보다 강력한 표현이 가능한 스키마 언어로서 등장한 것이 XML 스키마이다.
2. 스키마 문서의 최상위 엘리먼트는 <schema>이고, 새로운 엘리먼트 및 속성 선언과 관련해서는 다음과 같은 엘리먼트가 사용된다.
- <element>, <attribute>, <simpleType>, <complexType>, <group>, <attributeGroup>, <notation>, <annotation> 등
3. 엘리먼트는 element로 정의한다. 선언 방법은 이름과 자료형에 의한 선언(type 속성 이용), 참조에 의한 선언(ref 속성 이용), 익명 자료형에 의한 선언 방법(simpleType 또는 complexType 이용)으로 구분할 수 있으며, 초기값(default, fixed)과 출현회수(minOccurs, maxOccurs)를 지정할 수 있다.
4. 속성은 attribute로 정의하며, 속성도 엘리먼트와 마찬가지로 자료형에 의한 선언, 참조에 의한 선언, 익명 자료형에 의한 선언이 가능하다. 또한 초기화 및 출현회수(use 속성 이용) 지정도 가능하며, attributeGroup을 사용해서 속성 그룹을 작성할 수도 있다.
5. 주석은 <annotation> 엘리먼트의 자식 엘리먼트를 이용해서 정의한다. <documentation> 엘리먼트는 문서가 의도하는 목적을 이해하기 쉽게 도와주는 정보를 넣을 때 이용하고, 반면에 <appinfo> 엘리먼트는 처리 애플리케이션에 대한 추가적인 정보를 제공할 수 있다.
'정보과학 > 웹서비스특론' 카테고리의 다른 글
SOAP (0) | 2023.09.07 |
---|---|
XML 스키마 (2) (0) | 2023.09.06 |
XML 네임스페이스 (0) | 2023.09.05 |
XML 문법 (0) | 2023.09.04 |
웹 서비스 개요 (1) | 2023.09.02 |