XML Schemaで複数の型を結合する
2つ以上の異なる制約条件を1つの要素・属性に対して適用するには、<xsd:restriction>要素と<xsd:union>要素を組み合わせ、2段階の手順を踏んで定義します。
カテゴリ | XML Schema | |
関連要素 | <xsd:restriction>、<xsd:union> | |
関連記事 | XML Schemaで文字列パターンを定義する |
HTMLにおける<body>タグを想定してみましょう。例えば、背景色を白に設定したいと思った場合、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のようにRGB形式の文字列で指定することも、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のように色名で指定することも可能です。
このように同じ属性であっても、異なる型(体系)で値を指定できるケースが少なくありません。このような場合にも、XML Schemaでは<xsd:union>要素を用いることで、2つ以上の異なる制約条件を1つの要素・属性に対して適用できます。
ここでは、出版社を表す<publish>要素を出版社番号(整数型)、または、出版者名(文字列型)で指定できるようにスキーマを定義してみます。なお、対象となるXML文書については、別稿「XML Schemaで文字列パターンを定義する」で用いたbook.xmlを参照してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ここでは、大きく2つのブロックに分けて理解する必要があります。
(1)結合する元となるデータ型を定義
まずは、結合する元となる2つのデータ型を定義しなければなりません。すなわち、以下の部分です。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ここでは、整数型をベースとした1〜5の値から構成されるpub_number型、文字列型をベースとした列挙値から構成されるpub_string型を規定しています。
(2)既存のデータ型を結合する
次に、これらのデータ型(単純型)を具体的な要素にひも付けると同時に、結合する必要があります。それが、以下の部分です。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
<xsd:union>要素で2つのデータ型を結合し、<published>要素の定義としてセットしています。これによって、<published>要素を整数値、もしくは文字列で指定することが可能になるというわけです。
実際に、妥当性検証を行いたい場合には、別稿「XML SchemaでXML文書の妥当性を検証する」のサンプルを参考にするとよいでしょう。変更個所は、XMLSchemaCache.addメソッドの第2引数(XML Schemaのファイル名)のみです。スキーマ文書を書いてみるだけでは、スキーマ文書そのものの妥当性を判断できませんが、パーサの処理を介することでスキーマの正否を確認できます。
Copyright © ITmedia, Inc. All Rights Reserved.