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の数字である必要があることを示しています。