目次へ

10.XML Schema を書く

本章では、XML Schemaのまとめとして、具体的にXML Schemaを書いてみたいと思います。

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

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp