この章では、XMLスキーマを作成する方法を紹介します。 また、スキーマが異なる方法で書き込むことができることを学びます。
XMLドキュメント
のと呼ばれるこのXML文書を見てみましょう"shiporder.xml" :
<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</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" :要素は、3つの異なる子要素が含まれ"orderperson" 、 "shipto"と"item" 。 "item"要素が2回出現し、それが含まれている"title" 、オプションの"note"要素、 "quantity" 、および"price"の要素を。
xmlns:上記の行のxsi = "http://www.w3.org/2001/XMLSchema-instanceは「この文書はスキーマに対して検証されるべきであるXMLパーサーに指示します。 行:XSIは:のnoNamespaceSchemaLocation = "shiporder.xsdは、「WHEREスキーマが存在する指定(here it is in the same folder as "shiporder.xml") 。
XMLスキーマを作成します。
今、私たちは、上記のXML文書のスキーマを作成します。
私たちは、私たちが呼ぶ新しいファイル開くことによって開始する"shiporder.xsd" 。 スキーマを作成するには、単にXML文書内の構造に従ってください、我々はそれを見つけるように各要素を定義することができます。 スキーマを定義するスキーマ要素:我々は、xs続いて、標準的なXML宣言で始まります。
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>
我々上記のスキーマでは、標準的な名前空間を使用(xs)この名前空間に関連付けられており、URIをhttp://www.w3.org/2001/XMLSchemaの標準値を持つスキーマ言語の定義、です。
次に、我々が定義する必要があり"shiporder"要素を。 したがって、我々は複合型としてそれを考慮し、この要素には属性があり、それは他の要素が含まれています。 子要素"shiporder"サブ要素の順序付けられたシーケンスを定義し、配列要素:要素はXSに囲まれています:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
</xs:element>
その後、我々は定義する必要があり"orderperson" (それは任意の属性や他の要素が含まれていないので)単純型としての要素を。 タイプ(xs:string)事前に定義されたスキーマのデータ型を示すXMLスキーマに関連付けられた名前空間接頭辞が付きます。
<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>
スキーマで、私たちは、maxOccurs属性やminOccurs属性属性を持つ要素のための可能な出現回数を定義することができます。 maxOccursのは、要素の出現回数の最大値を指定し、minOccurs属性は、要素のオカレンスの最小数を指定します。 maxOccurs属性やminOccurs属性の両方のデフォルト値は1です!
今、私たちは定義することができる"item"の要素を。 この要素は、内部に複数回表示されることが"shiporder"要素。 これは、設定することによって指定されているmaxOccursの属性"item"の要素に"unbounded"のような多くの出現があり得ることを意味し"item"の著者の願いとして要素を。 ていることに注意してください"note"の要素はオプションです。 私たちは、設定することで、これを指定したminOccursゼロに属性を:
<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"要素を。 これは我々が使用することを指定する必須属性ですので= "必要"。
Note:属性宣言は、常に最後にする必要があります。
<xs:attribute name="orderid" type="xs:string" use="required"/>
ここで呼ばれるスキーマファイルの完全なリストである"shiporder.xsd" :
<?xml version="1.0" encoding="UTF-8" ?>
<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>
スキーマを分割
従来の設計法は非常に簡単であるが、読み取りおよび文書が複雑である場合に維持することが困難であることができます。
次の設計方法は、すべての要素を定義することに基づいており、最初の属性、およびその後使用して、それらを参照しているref属性を。
ここでは、スキーマファイルの新しいデザインです("shiporder.xsd") :
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- definition of simple elements -->
<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"/>
<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- definition of complex elements -->
<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の設計方法は、要素の定義を再利用するために私たちを可能にする、クラスや型を定義します。 これは、のsimpleTypesとのcomplexType要素を命名することによって行われ、その後を介してそれらを指すされたtype要素の属性。
ここでスキーマファイルの第3の設計である("shiporder.xsd") :
<?xml version="1.0" encoding="UTF-8" ?>
<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>
制限要素は、データ型は、W3C XML Schemaの名前空間データ型から派生していることを示します。 そこで、以下の断片は、要素または属性の値が文字列値でなければならないことを意味します。
<xs:restriction base="xs:string">
制限要素は、より頻繁に要素に制限を適用するために使用されます。 上記のスキーマから次の行を見てください:
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
これは、要素または属性の値は文字列でなければなりません、それは行で正確に6文字でなければなりませんし、それらの文字は、0から9までの数でなければならないことを示しています。