XSDの例

このセクションでは、XMLスキーマの作成方法を説明します。スキーマの書き方の異なる方法も学びます。

XMLドキュメント

「shiporder.xml」という名前のXMLドキュメントを見てみましょう:

<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</country>
 </shipto>
 <item>
  <title>Empire Burlesque</title>
  <note>Special Edition</note>
  <quantity>1</quantity>
  <price>10.90</price>
 </item>
 <item>
  <title>Hide your heart</title>
  <quantity>1</quantity>
  <price>9.90</price>
 </item>
</shiporder>

上記のXMLドキュメントには、"shiporder"というルート要素が含まれており、必ず"orderid"という名前の属性を持っています。"shiporder"要素には、"orderperson"、"shipto"、および"item"という3つの異なる子要素が含まれています。"item"要素は2回登場し、"title"、オプションの"note"要素、"quantity"、および"price"要素を含んでいます。

この行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" は、XMLパーサーが特定のスキーマに基づいてこのドキュメントを検証するように指示しています。この行:xsi:noNamespaceSchemaLocation="shiporder.xsd" は、スキーマの場所を指定しています(ここでは、"shiporder.xml" と同じフォルダにあります)。

XML Schemaを作成します

今や、上記のXMLドキュメントにschemaを作成する必要があります。

新しいファイルを開き、その名前を"shiporder.xsd"とします。schemaを作成するには、単にXMLドキュメントの構造に従って、発見した各要素を定義するだけで十分です。まずは標準のXML宣言を定義します:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...
</xs:schema>

上記のschemaでは、標準の命名空間(xs)を使用しており、この命名空間はSchemaの言語定義(Schema language definition)に関連付けられています。その標準値はhttp://www.w3.org/2001/XMLSchemaです。

次に、"shiporder"要素を定義する必要があります。この要素は属性を含んでいるため、複合型と認定されます。"shiporder"要素の子要素はxs:sequence要素で囲まれており、子要素の順序を定義しています:

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

次に、"orderperson"要素をシンプル型として定義する必要があります(これは属性や他の要素を含まないためです)。型(xs:string)のプレフィックスは、命名空間のプレフィックスによって規定されており、この命名空間は、指示されたプレデファインドのschemaデータタイプのXMLschemaに関連付けられています:

<xs:element name="orderperson" type="xs:string"/>

次に、私は二つの要素を複合型として定義する必要があります:"shipto"と"item"。まず"shipto"要素の定義から始めます:

<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="name" type="xs:string"/>
   <xs:element name="address" type="xs:string"/>
   <xs:element name="city" type="xs:string"/>
   <xs:element name="country" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

schemaを通じて、maxOccursとminOccurs属性を使用して、ある要素がどの程度出現できるかを定義できます。maxOccursはある要素が出現できる回数の最大値を定義し、minOccursは最小値を定義します。maxOccursとminOccursのデフォルト値はどちらも1です!

現在、"item"要素を定義することができます。この要素は"shiporder"要素内に複数回出現することができます。これを実現するために、"item"要素のmaxOccurs属性の値を"unbounded"に設定しています。これにより、"item"要素は作成者が希望する任意の回数出現することができます。注意してください、"note"要素はオプション要素です。すでにこの要素のminOccurs属性を0に設定しています:

<xs:element name="item" maxOccurs="unbounded">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="title" type="xs:string"/>
   <xs:element name="note" type="xs:string" minOccurs="0"/>
   <xs:element name="quantity" type="xs:positiveInteger"/>
   <xs:element name="price" type="xs:decimal"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

今や「shiporder」要素の属性を宣言できます。これは必須属性であるため、use="required"と規定します。

注釈:この属性の宣言は最後に置かれなければなりません:

<xs:attribute name="orderid" type="xs:string" use="required"/>

これは「shiporder.xsd」と呼ばれる schema ファイルのドキュメントリストです:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="orderperson" type="xs:string"/>
   <xs:element name="shipto">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="item" maxOccurs="unbounded">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
  <xs:attribute name="orderid" type="xs:string" use="required"/>
 </xs:complexType>
</xs:element>
</xs:schema>

Schemaの分割

前の設計方法は非常に簡単ですが、文書が複雑になると読みやすく、保守が難しくなります。

次に紹介する設計方法は、まずすべての要素と属性の定義を行い、それから ref 属性を使用してそれらを参照する方法に基づいています。

これは新しい方法で設計された schema ファイルです:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 簡易要素の定義 -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
<!-- 属性の定義 -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- 複合要素の定義 -->
<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="name"/>
   <xs:element ref="address"/>
   <xs:element ref="city"/>
   <xs:element ref="country"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="item">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="title"/>
   <xs:element ref="note" minOccurs="0"/>
   <xs:element ref="quantity"/>
   <xs:element ref="price"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="orderperson"/>
   <xs:element ref="shipto"/>
   <xs:element ref="item" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute ref="orderid" use="required"/>
 </xs:complexType>
</xs:element>
</xs:schema>

指定されたタイプ(名前付きタイプ)を使用します

第3種の設計方法は、クラスやタイプを定義し、要素の定義の再利用を可能にする。具体的には、まずシンプル要素と複合要素に名前を付け、それらをtype属性を通じて指し示す方法です。

これは第3種の方法で設計されたschemaファイル("shiporder.xsd")です:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
 <xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
 <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
 <xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
 <xs:sequence>
  <xs:element name="name" type="stringtype"/>
  <xs:element name="address" type="stringtype"/>
  <xs:element name="city" type="stringtype"/>
  <xs:element name="country" type="stringtype"/>
 </xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
 <xs:sequence>
  <xs:element name="title" type="stringtype"/>
  <xs:element name="note" type="stringtype" minOccurs="0"/>
  <xs:element name="quantity" type="inttype"/>
  <xs:element name="price" type="dectype"/>
 </xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
 <xs:sequence>
  <xs:element name="orderperson" type="stringtype"/>
  <xs:element name="shipto" type="shiptotype"/>
  <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
 </xs:sequence>
 <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>

restriction要素は、W3C XML Schema命名空間のデータタイプを持つデータタイプのデータを示しています。したがって、以下の部分は、要素または属性の値が文字列タイプの値であることを意味します:

<xs:restriction base="xs:string">

restriction要素は、要素に制限を施すためによく使用されます。以下は、上記schemaからの一部の例です:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

このコードは、要素または属性の値が文字列でなければならず、連続した6文字でなければならず、これらの文字が0-9の数字である必要があることを示しています。