XMLスキーマ

XMLスキーマとは、XML文書のスキーマ定義を行うスキーマ定義言語です。DTDと異なり、XMLスキーマはXMLの文法に則って記述します。その使い方とサンプルをご紹介します。

XMLスキーマのルート要素はschemaであり、名前空間の接頭辞xsdを付けて、xsd:schemaと表記される。

xsd:schema 要素の開始タグと終了タグがそれぞれXMLスキーマ定義の開始と終了を意味します。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <-- スキーマ定義 -->
</xsd:schema>

名前空間

XMLスキーマの名前空間URIは「http://www.w3.org/2001/XMLSchema」である。

xmlns属性で接頭辞を定義することにより、各要素に名前空間を表す任意の接頭辞を付けることができるが、XMLスキーマの接頭辞は慣習的に xsd 又は xs という接頭辞にすることが多い。

要素

XMLスキーマの要素を次の表に示す。

XMLスキーマの要素
要素 説明
schema XMLスキーマのルート要素
element 要素の定義
attribute 属性の定義
complexType 複合型の定義
sequence 要素の順序の定義
choice 要素の択一の定義
annotation コメント
appinfo システムが参照するコメント
documentation 人間が参照するコメント
extension 単純型に属性持たせる。
restriction データ型に制限を加える。
attribute 属性グループを定義する。

schema

XMLスキーマのルート(最上位)要素です。開始タグ <xsd:schema> がXMLスキーマ定義の開始、終了タグ </xsd:schema> がXMLスキーマ定義の終了を表します。開始タグと終了タグの間に要素(エレメント)や属性(アトリビュート)の定義を記述します。

(子要素を含まない)要素の定義は xsd:element 、属性の定義は xsd:attribute で行います。複数の子要素を含む要素は xsd:complexType で行います。

属性

schema要素の属性
Attribute Description
blockDefault 指定した派生型を持つcomplexTypeが継承したcomplexTypeの代わりに使用されないようにする。
targetNamespace このスキーマで定義する言語の名前空間をURIで指定する。
xmlns[:prefix] XMLスキーマの名前空間をURIで指定する。

親要素

なし

子要素

element、complexType、annotation、import、group、simpleType、attributeGroup

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="book" type="BookType"/>
  <xsd:complexType name="BookType">
    <xsd:element name="author" type="xsd:string"/>
    <xsd:element name="price" type="xsd:int"/>
    <xsd:attribute name="isbn" type="xsd:string" use="required"/>
  </xsd:complexType>
</xsd:schema>

element

要素(エレメント)を定義します。

書式

<xsd:element name=" string " type=" string " minOccurs=" number " maxOccurs=" number " />

属性

name
属性には要素名を指定する。
type
データ型として、組み込みデータ型または複合型( xsd:complexType )を指定します。
maxOccurs
最大出現回数を指定します。maxOccursを省略すると"1"を指定したものとみなされます。出現回数の上限をなくす場合は maxOccurs="unbounded" と指定します。
minOccurs
最少出現回数を指定します。minOccursを省略すると"1"を指定したものとみなされます。"0"を指定すると省略可能な要素となります。

<xsd:element name="data">
<xsd:complexType>
  <xsd:element name="name" type="xsd:string" minOccurs="2" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element name="data">

attribute

XMLスキーマのattribute要素は、属性を定義する要素である。

属性

type

データ型として、組み込みデータ型または複合型(complexType)を指定する。

use
定義した属性が必須かどうかを次の値の中から指定します。
attributeのuse属性
説明
required 必須
optional 省略可能(規定値)
prohibited 存在を禁止
default

use属性がoptional の場合、省略時のデフォルト値を指定します。default 属性と fixed 属性は併用できません。

fixed

固定値を指定します。default属性とfixed属性は併用できません。

親要素

attributeGroup、extension、restriction

複合型(complexType)の要素 book に属性 isbn を定義する例を示します。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="book" type="BookType"/>
  <xsd:complexType name="BookType">
    <xsd:element name="author" type="xsd:string"/>
    <xsd:element name="price" type="xsd:int"/>
    <xsd:attribute name="isbn" type="xsd:string" use="required"/>
  </xsd:complexType>
</xsd:schema>
<xs:complexType name="foo">
  <xs:element name="bar" type="xs:string"/>
  <xs:attribute name="baz" type="xs:string" use="optional" default="qux"/>
</xs:complexType name="foo">

<xs:complexType name="quux">
  <xs:element name="foobar" type="xs:string"/>
  <xs:attribute name="baz" type="xs:string" use="optional" default="qux"/>
</xs:complexType name="foo">

あらかじめ定義した属性をrefで参照することもできる。上記のサンプルは次のような書き方もできる。

<xs:attribute name="baz" type="xs:string" use="optional" default="qux"/>

<xs:complexType name="foo">
  <xs:element name="bar" type="xs:string"/>
  <xs:attribute ref="baz"/>
</xs:complexType name="foo">

<xs:complexType name="quux">
  <xs:element name="foobar" type="xs:string"/>
  <xs:attribute ref="baz"/>
</xs:complexType name="foo">

complexType

複合型を定義します。複合型は複数の子要素を含む変数型で、組み込み変数型の子要素や他の複合型の子要素を持つことができます。

複合型に複数の子要素を定義したとき、その子要素の出現順序は順不同です。例えば、 XMLスキーマで複合型 book の子要素として titleauthor の2つの子要素を持つように定義した場合、実際のXMLデータで titleauthor のどちらの子要素が先に出現しても構いません。子要素の順番まで決めたい場合は xsd:sequence で子要素の出現順序を定義します。

書式

<xsd:complexType name="名前"> 1つ以上の要素定義 </xsd:complexType>

属性

name
複合型に付ける名前を指定します。

次に xsd:complexType を使用したXMLスキーマの例を示します。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="book" type="BookType"/>
  <xsd:complexType name="BookType">
    <xsd:element name="author" type="xsd:string"/>
    <xsd:element name="price" type="xsd:int"/>
    <xsd:attribute name="isbn" type="xsd:string" use="required"/>
  </xsd:complexType>
</xsd:schema>

上記の例では、子要素authorと子要素priceを持つ複合型 BookType を定義しています。

sequence

xsd:sequence は、要素の順番を定義します。開始タグと終了タグの間の要素定義は、記述された順序性を保ちます。 開始タグと終了タグの間に要素(エレメント)定義があれば、その定義された順番を保ちます。

書式

<xsd:sequence> ... </xsd:sequence>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="address" type="AddressType" />
  <xsd:ComplexType name="AddressType" />
    <xsd:sequence>
      <xsd:element ref="address" />
      <xsd:element ref="name" />
    </xsd:sequence>
  <xsd:element name="text" type="xsd:string" />
<xsd:element name="number" type="xsd:int" />

choice

開始タグ <xsd:choice> と終了タグ </xsd:choice> の間で定義された複数の要素のうち、ひとつだけ存在を許します。

書式

<xsd:choice> ... </xsd:choice>

使用例

<xsd:complexType name="AccountNo">
  <xsd:choice>
    <xsd:element name="bank" type="xsd:string" />
    <xsd:element name="postalSaving" type="xsd:string" />
  </xsd:choice>
</xsd:complexType>

annotation

XMLスキーマのannotation要素は、XMLスキーマ文書内にコメントを入れるための要素である。

属性

annotationの属性
属性 説明
xmlns XMLスキーマの名前空間をURIで指定する。接頭辞を指定している場合は省略できる。

子要素

appinfo、documentation

サンプル

<xs:annotation>
  <xs:appinfo>foo</xs:appinfo>
  <xs:documentation>サンプルです。</xs:documentation>
</xs:annotation>

appinfo

XMLスキーマのappinfo要素は、システムが参照するためのコメントを記述する要素である。

属性

annotationの属性
属性 説明
xmlns XMLスキーマの名前空間をURIで指定する。接頭辞を指定している場合は省略できる。

親要素

annotation

子要素

なし

documentation

XMLスキーマのdocumentation要素は、人間が参照するためのコメントを記述する要素である。

属性

annotationの属性
属性 説明
source より詳細なドキュメントの場所を表すURIを指定する。
xmlns XMLスキーマの名前空間をURIで指定する。接頭辞を指定している場合は省略できる。

親要素

annotation

子要素

なし

サンプル

<xs:annotation>
  <xs:appinfo>foo</xs:appinfo>
  <xs:documentation source="http://itref.fc2web.com/xml/xmlschema.html">サンプルです。</xs:documentation>
</xs:annotation>

組み込みデータ型

組み込みデータ型の一覧を以下に示します。

XMLスキーマの組み込みデータ型
型名 説明
anyURI URI
base64Binary バイナリデータ。Base64方式
boolean true/false
byte 1バイトの整数
date 日付
datetime 日付+時刻
decimal 10進数
double 64ビットの浮動小数点数
duration 特定期間の時間
ENTITIES 複数のエンティティ
ENTITY エンティティ
float 32ビットの浮動小数点数
gDay 日付
gMonth
gMonthDay 日付
gYear
gYearMonth 年+月
hexBinary バイナリデータ。Base64方式16進
ID 識別子
IDREF 識別子への参照
IDREFS 複数の識別子への参照
int 4バイトの整数
integer 整数
language xml:langの属性値
long 8バイトの整数
Name XML1.0の名前
NCName 名前空間名の接頭辞以下
negativeInteger 負の整数
NMTOKEN 名前トークン
NMTOKENS 複数の名前トークン
nonNegativeInteger 負でない整数
nonPositiveInteger 正でない整数
normalizedString 復帰・改行・タブなし文字列
NOTATION 記法属性
positiveInteger 正の整数
QName 名前空間名
short 2バイトの整数
string 文字列
time 時刻
token 改行・タブ・半角スペースなしトークン文字列
unsignedByte 1バイトの正の整数。
unsignedInt 4バイトの正の整数
unsignedLong 8バイトの正の整数
unsignedShort 2バイトの正の整数

組み込みデータ型は xsd:elementxsd:attribute などの type 属性に指定することができます。

次に組み込みデータ型を使用したXMLスキーマの例を示します。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="book" type="BookType"/>
  <xsd:complexType name="BookType">
    <xsd:element name="author" type="xsd:string"/>
    <xsd:element name="price" type="xsd:int"/>
    <xsd:attribute name="isbn" type="xsd:string" use="required"/>
  </xsd:complexType>
</xsd:schema>

上記の例では、文字列型の要素authorと4バイト整数型の要素priceを定義しています。

XMLスキーマインスタンス

XMLスキーマインスタンスでは、XMLインスタンスで使用する4つの属性を定義している。

XMLスキーマインスタンスの名前空間URIは「http://www.w3.org/2001/XMLSchema-instance」である。

xmlns属性で接頭辞を定義することにより、各要素に名前空間を表す任意の接頭辞を付けることができるが、XMLスキーマインスタンスの接頭辞は慣習的に xsi という接頭辞にすることが多い。

XMLスキーマインスタンスには、次の属性がある。

nil
要素にコンテンツが不足している場合はtrueを指定する。
noNamespaceSchemaLocation
対象の名前空間が無いスキーマドキュメントをインスタンスドキュメントに関連付ける。
schemaLocation
対象の名前空間を持つスキーマドキュメントをインスタンスドキュメントに関連付ける。
type
要素の型を指定する。