データ型
前編でDTDになくW3C XML Schemaにあるものとしてデータ型を挙げましたが、ほとんど説明できませんでした。データ型についてはXML Schema Part 2: Datatypes Second Editionを読むのが一番だと考え、体系的な説明は避けてきました。当記事でも今まで紹介してきたXML文書から抜粋する形で説明します。
ビルトインデータ型
今まで説明したXML文書中にもxsd:stringやxsd:positiveIntegerなど使ってきました。このように接頭辞にxsdが付くデータ型をビルトインデータ型と呼びます。プログラム言語でもよく使用するboolean、float、double、timeなどを含め46ものビルトインデータ型があります。
単純型と複合型
単純型(simpleType)
sample3.xsdを見ると、以下のようにxsd:simpleTypeという定義があります。
109:<xsd:simpleType name="VintageType"> 110: <xsd:restriction base="xsd:positiveInteger"> 111: <xsd:minInclusive value="1900"/> 112: <xsd:maxInclusive value="2099"/> 113: </xsd:restriction> 114:</xsd:simpleType> 115: 116:<xsd:simpleType name="RankType"> 117: <xsd:restriction base="xsd:string"> 118: <xsd:enumeration value="DOC"/> 119: <xsd:enumeration value="DOCG"/> 120: <xsd:enumeration value="IGT"/> 121: <xsd:enumeration value="スーパーIGT"/> 122: </xsd:restriction> 123:</xsd:simpleType>
これらVintageTypeやRankTypeが単純型と呼ばれるものです。この2つのタイプはrestrictionにより派生しています。VintageTypeの場合、元となるデータ型がbase属性の値であるxsd:positiveIntegerです。restrictionはこの元となるデータ型に文字通り制限を加え、新しい型を定義することを指します。111行目と112行目がその制限です。この制限のことを制約ファセットと呼びます。この場合、1900以上、2099以下の正の整数であると制限を加えています。
RankTypeの場合、元となるデータ型がxsd:stringであり、値としてDOC、DOCG、IGT、スーパーIGTのいずれかのみに制限を加えています。
単純型の場合、restriction以外にも、unionやlistがあります。
複合型(complexType)
複合型は単純型と比較して少し難し概念です。単純型内容を持つ複合型と複合型内容を持つ複合型があります。
単純型内容を持つ複合型
sample3.xsdを見ると、以下のようにxsd:complexTypeという定義があります。
031:<xsd:complexType name="GreetingType"> 032: <xsd:simpleContent> 033: <xsd:extension base="xsd:string"> 034: <xsd:attribute name="OWNER" type="xsd:string" use="required"/> 035: </xsd:extension> 036: </xsd:simpleContent> 037:</xsd:complexType>
その子要素としてsimpleContentがありますが、これが単純型内容です。要するにxsd:stringをデータ型として持つ要素をextension(拡張)することにより複合型を定義しようとしています。単純型とは要素内容を持つだけのものを指します。GreetingTypeの例では、その単純内容に属性を追加することで複合型を定義していることになります。単純型内容を持つ複合型はextensionのほかに単純型のように制約ファセットを使い制限(restriction)することにより定義することも可能です。
複合型内容を持つ複合型
今までの型の説明から分かるとおり、内容として複合型を持つものを拡張や制限により定義される型を複合型内容を持つ複合型と呼びます。sample3.xsdを見ると、以下のようにShopTypeはGREETING要素とMEIGARAS要素という要素を持つsequenceであることを定義しています。
024:<xsd:complexType name="ShopType"> 025: <xsd:sequence> 026: <xsd:element name="GREETING" type="GreetingType"/> 027: <xsd:element name="MEIGARAS" type="MeigarasType"/> 028: </xsd:sequence> 029:</xsd:complexType>
上記の定義の仕方は省略した記法で正確には以下のように、complexType要素の子要素としてcomplexContent、complexContentの子要素としてrestrictionが必要です。
024:<xsd:complexType name="ShopType"> <complexContent> <xsd:restriction base="xsd:anyType"> 025: <xsd:sequence> 026: <xsd:element name="GREETING" type="GreetingType"/> 027: <xsd:element name="MEIGARAS" type="MeigarasType"/> 028: </xsd:sequence> </xsd:restriction> </complexContent> 029:</xsd:complexType>
ただし、この組み合わせに変化がないためcomplexContentとrestriction要素は省略してもよいことになっています。この例ではsequenceを使いましたが、choiceやallを使用することもできます。
単純型内容を持つ複合型同様、拡張を使っての定義も可能です。
おさらい
業務システムの構築にも使えることを目標として説明しました。
- 重複して定義を避けるためにgroupという概念を説明しました。
- 複合型を定義する際、要素の出現の仕方を指定するためにsequence、choice、allを使用することができることを説明しました。今回はsequenceとchoiceを具体的な例として示しました。
- xml:lang、xml:space、xml:baseという名前空間宣言を必要としないグローバル属性について説明しました。今回はxml:langを具体的な例として示しました。
- XML文書とXMLスキーマ文書の関連付けの方法を説明しました。
参考サイト
非常に当たり前のサイトですが、「XML Schema Part 0: Primer Second Edition」は必ず読んで理解しておくべきものです。最後に紹介しているXMLEDITOR .NETはXMLエディタのサイトです。XMLの編集だけでなく、W3C XML Schemaの自動生成やW3C XML Schemaによる妥当性検証を行うことも出来ます。本連載で作成したMyXMLValidatorももう少し改良すれば妥当性検証には充分使えますが、このようなXMLエディタを利用するのもW3C XML Schemaを含めXML関連の技術を身につけるためには役立つと思います。
- XML Schema Part 0: Primer Second Edition
- XML Schema Part 1: Structures Second Edition
- XML Schema Part 2: Datatypes Second Edition
- XMLEDITOR .NET
サンプルコード
中編と同じく今回も新たにプロジェクトの作成もプログラムの作成も行っていないため、今回紹介したXML文書とXMLスキーマ文書のみを格納したファイルをページトップに置いています。ダウンロードしてご利用ください。妥当性検証はMyXMLValidatorクラスのSOURCE_PATHとXSD_PATHを書き換えビルドすることで行うことが可能です。参考サイトで紹介したXMLエディタでの妥当性検証も可能です。