• 1.簡単なXML Schemaから始めよう
• 2.複数要素を定義する4つの基本形を覚えよう
• 3.複雑型を定義する定番テクニック
• 4.豊富に用意されたデータ型を利用する
• 5.ユーザー独自のデータ型を作ろう
• 6.属性のデータ型、デフォルト値、グループ
XMLの構造を表すスキーマ言語とは?
スキーマ言語は、XMLのスキーマを記述するための言語で、「XMLがどのような構造になっているのか」を説明するためのものです。XMLパーサは、スキーマ言語を知っていれば、そのスキーマ言語で記述された文書を読むだけで、これから解析しようとしているXML文書の構造が分かるわけです。
XML Schemaの生い立ち
XMLのスキーマ言語として最もなじみ深いのはDTD(Document Type Definition)でしょう。DTDはXMLが誕生したときから存在するシンプルなスキーマ言語です。しかし、XMLの利用が急速に拡大し、その使用目的も多様化してきたため、DTDでは機能が不足してきています。そこで、DTDに代わるスキーマ言語として、XML Schemaが作成されました。
XML Schemaの生い立ち
• XML Schemaは次世代のスキーマ言語として、2001年にW3Cより勧告されました。XML Schemaは非常に強力なスキーマ言語で、「要素の内容には指定の文字列しか含まない」「この要素は最高5つまで指定可能」など、XMLの構造の細部まで指定できます。しかし、その半面仕様が膨大です。勧告当初は「XML Schemaを実装したXMLパーサは作成するのが困難」「使い物にならない」などといわれていました。しかし、2年たった現在、XML Schemaは確実に市場に受け入れられつつあります。
最も簡単なXML Schema
<greeting>Hello World!!</greeting>
XMLの構造は、以下のようになっています。
• ルート要素は、greeting
• greeting要素は属性を持たない
• greeting要素の内容は文字列
• greeting要素は子供要素を持たない
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="greeting" type="xsd:string"/>
</xsd:schema>
子要素を持つ要素のスキーマ定義:
<customer>
<name>安登 マーク</name>
<address>東京都千代田区丸の内3-3-1新東京ビル8F</address>
</customer>
1: <?xml version="1.0"?>
2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3: <xsd:element name="customer">
4: <xsd:complexType>
5: <xsd:sequence>
6: <xsd:element name="name" type="xsd:string"/>
7: <xsd:element name="address" type="xsd:string" />
8: </xsd:sequence>
9: </xsd:complexType>
10: </xsd:element>
11: </xsd:schema>
単純型と複雑型
• 複雑型
− 子要素または属性を持つ要素のデータ型
• 単純型
− 子要素および属性を持たない要素のデータ型、あるいは属性値のデータ型
− 複雑型を表す「complexType」
− 子要素の順番を指定する「sequence」
− ref属性で要素を参照
属性を宣言する
customer id="111111">
<name>安登 マーク</name>
<address>東京都千代田区丸の内3-3-1新東京ビル8F</address>
</customer>
11: <xsd:attribute name="id" type="xsd:string"/>
複雑型を定義する定番テクニック
maxOccurs属性
1:<?xml version="1.0"?>
2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3:
4: <xsd:element name="order">
5: <xsd:complexType>
6: <xsd:sequence>
7: <xsd:element name="orderItem"
type="xsd:string" maxOccurs="10"/>
8: </xsd:sequence>
9: </xsd:complexType>
10: </xsd:element>
11:
12:</xsd:schema>
7: <xsd:element name="orderItem"
type="xsd:string" maxOccurs="unbounded"/>
minOccurs属性
1:<?xml version="1.0"?>
2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3:
4: <xsd:element name="order">
5: <xsd:complexType>
6: <xsd:sequence>
7: <xsd:element name="orderItem"
type="xsd:string" maxOccurs="10"/>
8: <xsd:element name="comment"
type="xsd:string" minOccurs="0"/>
9: </xsd:sequence>
10: </xsd:complexType>
11: </xsd:element>
12:
13:</xsd:schema>
choice要素
1:<?xml version="1.0"?>
2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3:
4: <xsd:element name="order">
5: <xsd:complexType>
6: <xsd:sequence>
7: <xsd:element ref="orderItem" maxOccurs="10"/>
8: </xsd:sequence>
9: </xsd:complexType>
10: </xsd:element>
11:
12: <xsd:element name="orderItem">
13: <xsd:complexType>
14: <xsd:choice>
15: <xsd:element name="name" type="xsd:string"/>
16: <xsd:element name="id" type="xsd:string"/>
17: </xsd:choice>
18: </xsd:complexType>
19: </xsd:element>
20:
21:</xsd:schema>
豊富に用意されたデータ型を利用する
|
データ型の名前 |
内容 |
例 |
|
boolean |
真偽 |
true、false、1、0 |
|
base64Binary |
Base64エンコードされたバイナリ値 |
GpM7 |
|
hexBinary |
16進数 |
0FB7 |
|
float |
単精度32ビット浮動小数 |
-INF、-1E4、-0、0、12.78E-2、12、INF、NaN |
|
double |
倍精度64ビット浮動小数 |
-INF、-1E4、-0、0、12.78E-2、12、INF、NaN |
|
decimal |
10進数 |
-1.23、0、123.4、1000.00 |
|
integer |
整数 |
-126789、-1、0、1、126789 |
|
nonPositiveInteger |
0以下の整数 |
-126789、-1、0 |
|
negativeInteger |
0未満の整数 |
-126789、-1 |
|
long |
-9223372036854775808から9223372036854775807までの整数 |
-1、12678967543233 |
|
int |
-2147483648から2147483647までの整数 |
-1、126789675 |
|
short |
-32768から32767までの整数 |
-1、12678 |
|
byte |
-128から127までの整数 |
-1、126 |
|
nonNegativeInteger |
0以上の整数 |
0、1、126789 |
|
unsignedLong |
0から18446744073709551615までの整数 |
0、12678967543233 |
|
unsignedInt |
0から4294967295までの整数 |
0、1267896754 |
|
unsignedShort |
0から65535までの整数 |
0、12678 |
|
unsignedByte |
0から255までの整数 |
0、126 |
|
positiveInteger |
1以上の整数 |
1、126789 |
基本データ型
|
データ型の名前 |
内容 |
例 |
|
duration |
ある一定の期間。例は「1年2カ月3日10時間30分12.3秒」を表す |
P1Y2M3DT10H30M12.3S |
|
dateTime |
特定の日時。例は「世界時間(UTC)から5時間遅れの東部標準時 |
1999-05-31T13:20:00.000-05:00 |
|
time |
時刻。例は「世界時間(UTC)から5時間遅れの東部標準時における午後1時20分」を表す |
13:20:00.000-05:00 |
|
date |
日付。例は「1999年5月31日」を表す |
1999-05-31 |
|
gYearMonth |
グレゴリアン暦の年月。例は「1999年2月」を表す |
1999-02 |
|
gYear |
グレゴリアン暦の年。例は「1999年」を表す |
1999 |
|
gMonthDay |
グレゴリアン暦の月日。例は「5月31日」を表す |
--05-31 |
|
gMonth |
グレゴリアン暦の月。例は「5月」を表す |
--05-- |
|
gDay |
グレゴリアン暦の日。例は「31日」を表す |
---31 |
|
データ型の名前 |
内容 |
例 |
|
string |
文字列 |
Confirm this is electric. |
|
normalizedString |
改行文字、タブ文字を含まない文字列 |
Confirm this is electric |
|
token |
改行、先頭・末尾の空白、および2つ以上連続した空白を含まない文字列 |
Confirm this is electric |
|
language |
xml:lang属性の値として有効なもの。XML 1.0で定義されている |
en-GB、en-US、fr |
|
Name |
XML 1.0 Name型。要素や属性の名前に使用可能な形式の文字列で、先頭と2文字目以降に使用できる文字が規定された文字列 |
shipTo |
|
QName |
XML Namespace のQName。名前空間URIとローカル名の組からなる |
po:USAddress |
|
NCName |
XML Namespaceの NCName。QNameより接頭辞とコロンを取り除いたもの |
USAddress |
|
anyURI |
URIの形式をした文字列 |
http://www.example.com/doc.html#ID5 |
基本データ型
|
データ型の名前 |
内容 |
|
ID |
DTDのID型 |
|
IDREF |
DTDのIDREF型 |
|
IDREFS |
DTDのIDREFS型 |
|
ENTITY |
DTDのENTITY型 |
|
ENTITIES |
DTDのENTITIES型 |
|
NMTOKEN |
DTDのNMTOKEN型 |
|
NMTOKENS |
DTDのNMTOKENS型 |
|
NOTATION |
DTDのNOTATION型 |
ユーザー独自のデータ型を作ろう
パターンデータ型を作成する
<xsd:simpleType name="idType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/>
</xsd:restriction>
</xsd:simpleType>
値のリストを作成する
<xsd:simpleType name="idType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="4-8443-1780-6"/>
<xsd:enumeration value="4-7741-1751-1"/>
<xsd:enumeration value="4-7741-1684-1"/>
</xsd:restriction>
</xsd:simpleType>
数値の範囲を設定する
<xsd:simpleType name="quantityType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="10"/>
</xsd:restriction>
</xsd:simpleType>
属性のデータ型、デフォルト値、グループ
ユーザー独自のデータ型を属性に指定する
<xsd:attribute name="id" type="idType"/>
書かなければいけない? 書かなくてもよい?
<xsd:attribute name="id" type="idType" use="required"/>
|
属性値 |
内容 |
|
required |
属性は必ず書かなければならない |
|
optional |
属性は書かなくてもよい。もちろん書いてもよい |
|
prohibited |
属性は書いてはならない |
属性のデフォルト値
<xsd:attribute name="quantity" type="xsd:integer" default="1"/>