2010年3月16日火曜日

[XML] やりなおし XML Schema (2)

XML Schema Part 0: Primar を少しずつ読んでます。

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 version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">
// スキーマ定義 ...
</xsd:schema>
XML宣言、schema という要素および名前空間 http://www.w3.org/1999/XMLSchema は決め打ちなのでオマジナイと思えばよい。プリフィックスは別になんでもいいけれど、慣習として xsd が使われる。


定義(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 要素(まぎらわしい><)を使う。
こんな感じ。

<xsd:element name="comment" type="xsd:string" />
name属性が要素名、type属性が先ほどのデータ型を表す。typeに指定されている xsd:string はおそらく最もよく目にする組み込み型で、(見ればわかるが)文字列型を表す。type にはもちろん、xsd:simpleType や xsd:complexType でユーザ定義した型を指定することもできる。


属性の宣言には xsd:attribute 要素を使う。
こんな感じ。

<xsd:attribute name="country" type="xsd:NMTOKEN" use="fixed" value="US" />
要素の宣言と同じように、name 属性が属性名、type属性がデータ型を表す(この例ではオマケの属性がいくつかついているけれど)。要素の宣言と違うのは、type属性に単純型しか指定できない、ということ。属性は単純な値しかもてないことを思い出せば、当たり前といえる。


ここまでの知識(概略のみだけれど)で、最初の po.xsd が大体読めるようになった。

つづく。

0 件のコメント:

コメントを投稿