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に属しているか、常に意識する