メモ帳ブログ @ wiki
[XML] XMLスキーマ
最終更新:
nina_a
-
view
XMLスキーマ
このページはある程度XMLを知っている人や、XMLスキーマを何となく知っている人でないと分からないと思います。
XMLスキーマとは
XMLスキーマはXMLの要素の名前やその出現位置や回数などを定義する文書です。XMLスキーマの基本形は以下のようになっています。以下は文字列をコンテンツとして持つdefinitionという要素を定義するXMLスキーマです。
+ | XMLスキーマの雛形 |
要素を定義する
XMLの要素を定義するにはelementを使用します。
<xsd:element name="要素名" type="型名" />
型は既存の物ではなくその場で作成してもかまいません。このelement内で型を定義した場合,型の名前を省略することができて、この型のことを匿名型といいます。
<xsd:element name="要素名">
<!-- ここに型の定義を書く -->
</xsd:element>
要素を別の場所で定義しておいてそれを参照することが出来ます。
<xsd:element ref="参照する要素名" />
<xsd:element name="要素名">
<!-- ここに型の定義を書く -->
</xsd:element>
型を定義する
XMLの型には単純型と複合型の2種類があります。単純型は属性も子要素も持つことが出来ず,あるのはコンテント(内容)のみです。属性や子要素を持つ場合は複合型を利用します。
単純型 | 複合型 | |
例 | <date> 2011/10/28 </date> |
<date type="solar"> <year> 2011 </year> </date> |
属性の有無 | 無 | 有 |
子要素の有無 | 無 | 有 |
単純型の定義にはsimpleType、複合型の定義にはcomplexType要素を使用します。
単純型
組み込みの単純型の一覧は
google 検索
からどうぞ。単純型を作る方法は、(1)既存の単純型に制限を加えて作成、(2)いくつかの単純型からどれか1つを選択する単純型、(3)既存の単純型の複数形の3つがあります。
既存型の制限
既存の単純型に制限を加えるにはrestrictionを使用する。
<xsd:simpleType name="型名">
<xsd:restriction baseType="元にする型名">
<!-- 制限をここに記述する -->
</xsd:restriction>
</xsd:simpleType>
数値の制限
元にする単純型が数値の場合,最大値や最小値,桁数などを制限できます。
スキーマ | 制限 |
<xsd:minInclusive value="x" /> | 値はx以上である |
<xsd:maxInclusive value="x" /> | 値はx以下である |
<xsd:minExclusive value="x" /> | 値はxより大きい |
<xsd:maxExclusive value="x" /> | 値はxより小さい |
<xsd:totalDigits value="x" /> | 値の整数部はx桁以下である |
<xsd:fractionDigits value="x" /> | 値の少数部はx桁以下である |
- |
<!-- 最小値が0,最大値が9の整数値を定義 -->
<xsd:simpleType name="型名">
<xsd:restriction baseType="xsd:int"> <!-- intは組み込みの整数型 -->
<xsd:minInclusive value="0" />
<xsd:maxExclusive value="10" />
</xsd:restriction>
</xsd:simpleType> |
文字の制限
元にする単純型が文字列の場合、文字数の制限や、特定の文字列のみに制限したり、さらには正規表現による柔軟な制限も可能です。
スキーマ | 制限 |
<xsd:length value="x" /> | 文字列の長さはxである |
<xsd:minLength value="x" /> | 文字列の長さはx以上でである |
<xsd:maxLength value="x" /> | 文字列の長さはx以下である |
<xsd:enumeration value="x" /> | 文字列はxという値を取り得る |
<xsd:pattern value="x" /> | 文字列は正規表現xと一致する |
- |
<!-- 2文字以上3文字以下の文字列を定義 -->
<xsd:simpleType name="型名">
<xsd:restriction baseType="xsd:string"> <!-- stringは組み込みの文字列型 -->
<xsd:minLength value="2" />
<xsd:maxLength value="3" />
</xsd:restriction>
</xsd:simpleType> |
- |
<!-- 春、夏、秋、冬のみを受け入れる文字列を定義 -->
<xsd:simpleType name="型名">
<xsd:restriction baseType="xsd:string"> <!-- stringは組み込みの文字列型 -->
<xsd:enumeration value="春" />
<xsd:enumeration value="夏" />
<xsd:enumeration value="秋" />
<xsd:enumeration value="冬" />
</xsd:restriction>
</xsd:simpleType> |
- |
<!-- 郵便番号のみを受け入れる文字列を定義 -->
<xsd:simpleType name="型名">
<xsd:restriction baseType="xsd:string"> <!-- stringは組み込みの文字列型 -->
<xsd:pattern value="\d{3}-\d{4}" /> <!-- \d{3}-\d{4}は「数字3桁-数字4桁」を意味する正規表現 -->
</xsd:restriction>
</xsd:simpleType> |
型の選択
いくつかの単純型のうち、どれか1つを選択する場合にはunionを利用します。以下は正整数か負正数のどちらかをとる単純型を定義しています。
<xsd:simpleType name="型名">
<xsd:union memberTypes="xsd:positiveInteger xsd:negativeInteger" />
<!-- 半角スペースで区切って記述する -->
</xsd:simpleType>
型のリスト
既存の単純型の複数形を作成するにはlistを利用します。以下は複数個の整数をとる単純型を定義しています。
<xsd:simpleType name="型名">
<xsd:list itemType="xsd:int" />
</xsd:simpleType>
なお、(1)の方法によりリストの長さを制限することが可能です。
スキーマ | 制限 |
<xsd:length value="x" /> | リストの長さはxである |
<xsd:minLength value="x" /> | リストの長さはx以上でである |
<xsd:maxLength value="x" /> | リストの長さはx以下である |
複合型の定義
複合型の場合はsimpleTypeの代わりにcomplexTypeを使用して定義します。
<xsd:complexType name="型名">
<!-- ここに属性や子要素の定義を書く -->
</xsd:complexType>
複合型はコンテンツとして単純型を持つか、複合型を持つかの2通りに分けられます。
<!-- 単純型をコンテンツに持つ複合型 -->
<text lang="jp">日本語のテキスト</text>
<!-- 複合型をコンテンツに持つ複合型 -->
<text>
<lang code="jp">日本語のテキスト</lang>
</text>
単純型を持つ複合型
単純型をコンテンツに持つ複合型を定義するにはsimpleContentを使用します。
<xsd:complexType name="型名">
<xsd:simpleContent>
<xsd:extension base="元にする単純型名">
<!-- ここに属性を書く -->
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
また、元にする型に制限を加えることも出来ます。
<xsd:complexType name="型名">
<xsd:simpleContent>
<xsd:restriction base="元にする単純型名">
<!-- ここに制限を書く -->
<!-- ここに属性を書く -->
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
複合型を持つ複合型
複合型をコンテンツに持つ複合型を定義するにはcomplexContentを使用します。基本は単純型と同じです。
<xsd:complexType name="型名">
<xsd:complexContent>
<xsd:extension base="元にする複合型名">
<!-- ここに属性を書く -->
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
また、元にする複合型に制限を加えることも出来ます。
<xsd:complexType name="型名">
<xsd:complexContent>
<xsd:restriction base="元にする複合型名">
<!-- ここに制限を書く -->
<!-- ここに属性を書く -->
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
例えば、aという名前の要素を子要素に持つ型xは以下のように定義します。anyTypeという何でもありの型に「aという要素が登場する」という制限を加えて実現します。
<xsd:complexType name="x">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="a" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
子要素の制限
子要素の制限は「何が」,「どの順で」,「何回」でてくるかを制限できます。
- 要素指定 「何が」を制限するにはelement要素を指定します。
- 順序指定 「どの順で」を制限するにはsequence, choice, all要素のいずれかを利用します.
- 回数指定 「何回」を制限するにはminOccurs属性(最小出現回数)とmaxOccurs属性(最大出現回数)を使用します。いずれもデフォルトは1です。何回出現しても良い場合はmaxOccursにunboundedを指定します。
順序定義 | 説明 |
sequence | 順序指定。記述された通りの順序で要素が登場する。 |
choice | 順序不問。記述された要素のいずれかが登場する。 |
all | 順序不問。記述された要素が全てが1回登場するか、全て1回も登場しないかのどちらか。 |
出現回数の定義は順序定義によって微妙に異なります。sequenceは要素が順序通りに出現しきったら1回ですが、choiceは要素が出現したら1回になります。以下のスキーマを例に見ます。
<xsd:complexType name="x">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence maxOccurs="2">
<xsd:element name="a" type="aの型" />
<xsd:element name="b" type="bの型" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="y">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:choice maxOccurs="2">
<xsd:element name="a" type="aの型" />
<xsd:element name="b" type="bの型" />
</xsd:choice>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
sequenceであるxはa、bの順に登場したら1回ですが,choiceであるyはa、bのどちらかが登場したら1回です。
<x>
<a />
<b /> <!-- これで1回 -->
<a />
<b /> <!-- これで2回 -->
</x>
<y>
<a /> <!-- これで1回 -->
<b /> <!-- これで2回 -->
<b /> <!-- これで3回。最大出現回数を超えているのでこのXMLはエラーになる -->
</y>
もし、この要素は出現しなくても良いというように,各要素に対して出現回数を指定したい場合は,各要素に対してminOccursやmaxOccurs属性を指定します。
<xsd:complexType name="x">
<xsd:sequence>
<xsd:element name="a" minOccurs="0"/>
<xsd:element name="b" />
</xsd:sequence>
</xsd:complexType>
complexContentの省略
sequence、choice、allを使用する場合、complexContentとrestrictionを省略できます。
<xsd:complexType name="x">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="a" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<!-- 上のxと下のyの意味は同じです -->
<xsd:complexType name="y">
<xsd:sequence>
<xsd:element name="a" />
</xsd:sequence>
</xsd:complexType>
属性の定義
属性を定義するにはattribute要素を追加します。
<xsd:attribute name="属性名" type="属性値の型" />
属性を単純型を持つ複合型に定義する場合は「既存の単純型に属性を追加する」という拡張を行います。
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="既存の型">
<!-- 既存の型に属性を追加拡張 -->
<xsd:attribute name="属性名" type="属性値の型" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
属性を複合型を持つ複合型に定義する場合は、単純型と同じく既存の複合型を拡張する、あるいは「何でもありのanyTypeの属性を定める」という制限により行います。
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence> … </xsd:sequence>
<xsd:attribute name="属性名" type="属性値の型" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<!-- complexContentが省略された場合 -->
<xsd:complexType name="型名">
<xsd:sequence> … </xsd:sequence>
<xsd:attribute name="属性名" type="属性値の型" />
</xsd:complexType>
省略可能な属性はuse="optional"を指定します。省略された場合のデフォルト値を指定できます。
<xsd:attribute name="属性名" type="属性値の型" use="optional" default="デフォルト値" />
属性の参照とグループ化
複数箇所で使われるような属性はそれらを別に定義して参照することができます。
<xsd:complexType name="型名">
<xsd:sequence> … </xsd:sequence>
<xsd:attribute ref="参照する属性名" />
</xsd:complexType>
<xsd:attribute name="属性名" type="属性値の型" />
また、常にセットで扱われるような属性がある場合、それらをグループ化することができます。
<xsd:complexType name="型名">
<xsd:sequence> … </xsd:sequence>
<xsd:attributeGroup ref="参照する属性グループ名" />
</xsd:complexType>
<xsd:attributeGroup name="属性グループ名">
<xsd:attribute name="属性1"/>
<xsd:attribute name="属性2"/>
</xsd:attributeGroup>