XML Schema ってこんなもの
XML Schema Part 0: Primar 2章の例。
// po.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:annotation>
<xsd:documentation>
Purchase order schema for Example.com.
Copyright 2000 Example.com. All rights reserved.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
<xsd:element name="comment" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
<xsd:element name="shipTo" type="Address"/>
<xsd:element name="billTo" type="Address"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="Address">
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:decimal"/>
<xsd:attribute name="country" type="xsd:NMTOKEN"
use="fixed" value="US"/>
</xsd:complexType>
<xsd:complexType name="Items">
<xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:element name="productName" type="xsd:string"/>
<xsd:element name="quantity">
<xsd:simpleType base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="price" type="xsd:decimal"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="shipDate" type="xsd:date" minOccurs='0'/>
<xsd:attribute name="partNum" type="Sku"/>
</xsd:complexType>
</xsd:element>
</xsd:complexType>
<xsd:simpleType name="Sku" base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:simpleType>
</xsd:schema>
おまじない、もといルート要素
XML Schema 自体がXMLなので、XML宣言とルート要素 (schema要素) をもつ。どんな XML Schema ドキュメントも、外枠は必ず次のようになる。(XML Schema ファイルの拡張子は普通 ".xsd")
XML宣言、schema という要素および名前空間 http://www.w3.org/1999/XMLSchema は決め打ちなのでオマジナイと思えばよい。プリフィックスは別になんでもいいけれど、慣習として xsd が使われる。
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">
// スキーマ定義 ...
</xsd:schema>
定義(definition)と宣言(declaration)
・・・と言われましても^^; という感じだけれど、プログラミングでいう型(クラス)定義と変数宣言と同じ。まずはこの違いを押さえておかないと、先へ進めない。逆に言うと、この違いがわかれば本質がわかったようなもの(たぶん)。
XML Schema の要素でいうと、<xsd:complexType> 要素や <xsd:simpleType> 要素が「定義」にあたり、<xsd:element> 要素や <xsd:attribute> 要素が「宣言」にあたる。
2種類のデータ型: 単純型と
プログラミング言語で2種類のデータ型というと、普通プリミティブ型と構造型なんだけれど、それとは似て非なるので注意。
XML Schema は一般的なプログラミング言語と同じように「型」という概念があり、組み込みの型(数値、文字列、日付、etc.)があらかじめいくつか(いや、けっこう沢山・・・)定義されている。
この組み込み型と、組み込み型からの派生型(ユーザが組み込み型を
単純型があれば当然(?)、「
とりあえず2つの型を区別するには、
- 単純型 : 子要素も属性をもたず、タグの中に入るのは値(文字列とか)のみ。さらに組み込み型とその派生型( <xsd:simpleType> で定義されるもの)に分かれる。
複雑型複合型 : 子要素または属性(またはその両方)をもつ。 <xsd:complexType> で定義されるもの。
2010.03.17 修正
「複合型」を誤って「複雑型」と書いていたので修正(ひどいミス)。
要素・属性の宣言
"こんな要素や属性が現れるよ" と宣言すること。XML Schema の肝となる概念。
子要素や属性をもつ
要素の宣言には xsd:element 要素(まぎらわしい><)を使う。
こんな感じ。
name属性が要素名、type属性が先ほどのデータ型を表す。typeに指定されている xsd:string はおそらく最もよく目にする組み込み型で、(見ればわかるが)文字列型を表す。type にはもちろん、xsd:simpleType や xsd:complexType でユーザ定義した型を指定することもできる。
<xsd:element name="comment" type="xsd:string" />
属性の宣言には xsd:attribute 要素を使う。
こんな感じ。
要素の宣言と同じように、name 属性が属性名、type属性がデータ型を表す(この例ではオマケの属性がいくつかついているけれど)。要素の宣言と違うのは、type属性に単純型しか指定できない、ということ。属性は単純な値しかもてないことを思い出せば、当たり前といえる。
<xsd:attribute name="country" type="xsd:NMTOKEN" use="fixed" value="US" />
ここまでの知識(概略のみだけれど)で、最初の po.xsd が大体読めるようになった。
つづく。
0 件のコメント:
コメントを投稿