10.XML Schema を書く
本章では、XML Schemaのまとめとして、具体的にXML Schemaを書いてみたいと思います。
- 10.1 受注伝票
- 10.2 XML Schemaを書く
- 10.3 まとめ
- (参考) Restriction
10.2 XML Schemaを書く
それでは、受注伝票のスキーマをXML Schemaで記述してみましょう。
まず、Target Namespaceを決定します。Target Namespaceは作成したスキーマの名前になります。URI形式の文字列である必要があります。Target Namespaceは、できるだけ、設定しましょう。設定しない場合は、「カメレオンスキーマ」のリスクについて充分理解するべきです。ここでは、Target Namespaceを"http://www.4dd.co.jp/Order"とします。
XML Schema文書の書き出しは、以下のようになります。
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.4dd.co.jp/Order"
xmlns:o="http://wwww.4dd.co.jp/Order">
...
</schema>
XML Schema文書ももちろん、XML文書です。ですから、文書はXML宣言より開始します。次に、XML Schemaのルート要素である、schema要素を記述します。ここで、デフォルトNamespaceを設定しています。どんなものであれ、XML文書を記述するときは、Namespaceを意識することが有用であると思います。ここでは、XML Schemaを記述しています。XML SchemaのNamespceは"http://www.w3.org/2001/XMLSchema"です。要素宣言の際に使用するelement要素や、型定義に使用するcomplexType要素などはべて"http://www.w3.org/2001/XMLSchema"Namespaceに属します。element、complexType等のNamespaceを明示するためにも、ルート要素で、デフォルトNamespaceとして"http://www.w3.org/2001/XMLSchema"を指定します。
また、schema要素のtargetNamespace属性でTarget Namespace"http://www.4dd.co.jp/Order"を設定します。そして、Target Namespaceを表す、Namespace接頭辞を設定します。この意味については、後で記述します。
それでは、受注伝票のスキーマを記述します。XML Schemaは、ひとつの木構造を幾通りにも記述することが出来ます。木構造は同じでも、スキーマの使いやすさはだいぶ異なります。ここでは、シンプルなルールを守って、記述することをお勧めします。
- Local要素宣言は行わない。要素はすべてGlobal要素として宣言する。
- Global属性は宣言しない。再利用を考えるのであれば、Attribute Groupを作成し、そこで宣言する
以上のルールに従って、スキーマを記述した場合、XML 文書を書くときに、「要素のNamespaceは指定する、属性のNamespaceは指定しない」という簡単なルールに従えばよいことになります。
さらに、ここでは、Complex Typeはすべて、Anonymous Typeで宣言しています.Complex Typeの再利用は難しいと、個人的に考えているからです。
さて、ルート要素から記述していきます。まず、受注伝票要素です。受注伝票要素は、以下のような型のComplex Typeです。
| 要素名 | 子供要素 | 出現順番 | 出現回数 |
|---|---|---|---|
| 受注伝票 | 顧客、受注商品 | 顧客、受注商品の順 | 各1回ずつ |
XML Schemaで記述すると以下のようになります。
<element name="受注伝票">
<complexType>
<sequence>
<element ref="o:顧客"/>
<element ref="o:受注商品"/>
<sequence>
<attributeGroup ref="o:PurcaseOrderAttributeGroup"/>
</complexType>
</element>
Local要素宣言は使用せずに、要素を参照しています。
上の例を見ればわかると思いますが、名前を参照するときは、「どこのNamespaceに属している名前なのか」を意識しましょう。ここでは、同じスキーマで宣言されている顧客要素、受注商品要素を参照しています。これらは、もちろん、Target Namespace"http://www.4dd.co.jp/Order"に属しています。ですから、正確に"http://www.4dd.co.jp/Orderの顧客要素"と明示します。Namespaceは、Namespace接頭辞で設定します。schema要素の属性で、Target Namespaceを表すNamespace接頭辞を宣言したのは、このような意味があります。
また、属性はAttribute Group で宣言しています。属性の型は、以下の通りでした。
| 受注日 | date |
|---|---|
| 受注番号 | int |
XML Schemaはこのようになります。
<attributeGroup name="PurchaseOrderAttributeGroup"> <attribute name="受注日" type="date"/> <attribute name="受注番号" type="integer"/> </attributeGroup>
属性は、必ず、Localになるように宣言します。
次に、顧客要素、受注商品要素を宣言します。両方ともComplex Typeです。
| 要素名 | 子供要素 | 出現順番 | 出現回数 |
|---|---|---|---|
| 顧客 | 顧客名、顧客住所 | 顧客名、顧客住所の順 | 各1回ずつ |
| 受注商品 | 商品 | NA | 最低1回、最高5回 |
顧客名要素、顧客住所要素の型は、以下のように設定しました。
| 顧客名 | string |
|---|---|
| 顧客住所 | strint |
XML Schemaで記述すると以下のようになります。
<element name="顧客">
<complexType>
<sequence>
<element ref="o:顧客名"/>
<element ref="o:顧客住所"/>
</sequence>
</complexType>
</element>
<element name="顧客名" type="string"/>
<element name="顧客住所" type="string"/>
<element name="受注商品">
<complexType>
<sequence>
<element ref="o:商品" maxOccurs="5"/>
</sequence>
</complexType>
</element>
受注商品要素の宣言の中で、maxOccurs属性を使用して、商品要素の最高出現回数を5回に制限しています。その商品要素の型は、以下の通りです。
| 要素名 | 子供要素 | 出現順番 | 出現回数 |
|---|---|---|---|
| 商品 | 商品番号、商品名、数量、単価 | 商品番号、商品名、数量、単価の順 | 各1回ずつ |
XML Schemaで記述すると以下のようになります。
<element name="商品">
<complexType>
<sequence>
<element ref="o:商品番号"/>
<element ref="o:商品名"/>
<element ref"o:数量"/>
<element ref="o:単価"/>
</sequence>
</complexType>
</element>
商品番号の型は、既存の型にはありません。
| 商品番号 | 2桁の数字 |
|---|
「2桁の数字」を表す新たなSimpleTypeを作成する必要があります。Simple Typeを作成する場合は、既存のSimple Typeを基に作成します。ここでは、string型を正規表現によって、制限して作成しています。
<element name="商品番号" type="o:ProductnumberType"/>
<simpleType name="ProductnumberType">
<restriction base="string>
<pattern value="\d{2}" />
</restriction>
</simpleType>
最後に、残りの商品名、数量、単価の要素を宣言します。
| 商品名 | string |
|---|---|
| 数量 | int |
| 単価 | int |
XML Schemaで記述すると以下のようになります。
<element name="商品名" type="string"/> <element name="数量" type="integer"/> <element name="単価" type="integer"/>
スキーマをまとめると、以下のようになります。
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.4dd.co.jp/Order"
xmlns:o="http://www.4dd.co.jp/Order">
<element name="受注伝票">
<complexType>
<sequence>
<element ref="o:顧客"/>
<element ref="o:受注商品"/>
<sequence>
<attributeGroup ref="PurcaseOrderAttributeGroup"/>
</complexType>
</element>
<attributeGroup name="PurchaseOrderAttributeGroup">
<attribute name="受注日" type="date"/>
<attribute name="受注番号" type="integer"/>
</attributeGroup>
<element name="o:顧客">
<complexType>
<sequence>
<element ref="o:顧客名"/>
<element ref="o:顧客住所"/>
</sequence>
</complexType>
</element>
<element name="顧客名" type="string"/>
<element name="顧客住所" type="string"/>
<element name="受注商品">
<complexType>
<sequence>
<element ref="o:商品" maxOccurs="5"/>
</sequence>
</complexType>
</element>
<element name="商品">
<complexType>
<sequence>
<element ref="o:商品番号"/>
<element ref="o:商品名"/>
<element ref"o:数量"/>
<element ref="o:単価"/>
</sequence>
</complexType>
</element>
<element name="商品番号" type="o:ProductnumberType"/>
<simpleType name="ProductnumberType">
<restriction base="string>
<pattern value="\d{2}" />
</restriction>
</simpleType>
<element name="商品名" type="string"/>
<element name="数量" type="integer"/>
<element name="単価" type="integer"/>
</schema>
これで、受注伝票のためのスキーマの完成です。
10.3 まとめ
- XML Schemaを記述する場合は、データを「木構造」に構成する
- XML Schemaを記述するときは、「再利用しやすい」スキーマを記述するよう考慮する
- 「再利用」の一歩として、扱っている名前がどのNamespaceに属しているか、常に意識する

