XMLマスターポイントレッスン ~ ベーシック編 ~
第6回 XML Schemaのデータ型(前編)

インフォテリア認定教育センター 衣笠成一 KINUGASA, Seiichi

前回は、XML SchemaとDTDの定義の違い、XML Schemaの要素や属性の宣言方法について解説しました。今回は、XML Schemaにおけるユーザー定義のデータ型である「単純型」の制限と拡張について解説していきます。前回同様、ベーシックV2試験のセクション4「XML Schema」を攻略する上で必須の知識となりますので、しっかりと学習しておきましょう。

XML Schemaのデータ型

前回、「XML Schemaではすべてデータ型として定義する」と説明しましたが、データ型には、あらかじめ定義された「組み込み単純型」というものがあり、これらを制限したり拡張したりして新しい型を独自に作ることができます。XMLSchemaのデータ型は、大きく「単純型(組み込みデータ型を含む)」と「複合型」の2種類に分類できます(表1)。

表1:XML Schema のデータ型の種類

組み込み
単純型
プログラム言語やDBMSなどで使用される一般的なデータ型やDTDで利用されているID型やNMTOKEN型なども含め44のデータ型が用意されている
単純型 ユーザーが独自に定義する型。
この型は、組み込み単純型に制限を設定して、新しい型として利用する場合に使用する
複合型 ユーザーが独自に定義する型。
この型は、子要素や属性を持つ場合に使用する

単純型とは、XML 1.0で表現したときに文字列値のみを持つ型のことで、要素宣言や属性宣言で使用できます。XML Schema Part2では、組み込み単純型が用意されています。また、組み込み単純型に制限を設定して独自の単純型を作ることもできます。

一方の複合型とは、XML 1.0で表現したときに子要素や属性などの構造を持つ型のことで、要素宣言で使用できます。あらかじめ用意されている複合型はありませんので、ユーザーが独自に定義することになります。

●単純型の例

<xs:element name="所属" type="xs:string" />

この中で、「xs:string」と記述されている部分がXML Schemaの組み込み単純型です。ここでは、「名前が“所属”の要素は、データ型が文字列である」ことを定義しています。

●複合型の例

<xs:complexType name="EmployeeType">
  <xs:sequence maxOccurs="unbounded">
    <xs:element ref="名前" />
    <xs:element ref="所属" />
  </xs:sequence>
</xs:complexType>
<xs:element name="名前" type="xs:string" />
<xs:element name="所属" type="xs:string" />

この場合、complexType要素のname属性で型の名前「EmployeeType」を指定し、子要素にモデルグループ(子要素の出現順序を指定するもの)を指定しています。

この単純型や複合型を制限/拡張することで新しい型を作成します。すなわち、型の再利用です。再利用するには表2のような方法がありますが、今回は単純型の制限と拡張について説明します。

表2:型の再利用の方法

基底型 再利用 新しい型 用途
単純型 制限(restriction) 単純型(simpleType) データ型に制限を加える
拡張(extension) 複合型(complexType) 単純型に属性を持たせる
複合型 制限(restriction) 複合型(complexType) 型の再利用
拡張(extension) 複合型(complexType) 型の再利用

単純型の制限

「単純型の制限」とは、組み込み単純型で定義されたintやstringなどの基本となるデータ型に対して最小値/最大値、文字数などの制限を設け、新しい型としてユーザー定義の単純型を作成することです。

言葉だけではなかなか分かりにくいと思いますので、どのように単純型の制限を定義するのか、次の3つの例で考えてみましょう。

  • [1] パスワード要素は文字列型で、6文字から12文字までとする
  • [2] 社員番号要素は整数型で、1000以上10000未満とする
  • [3] 所属要素は文字列型で、「営業部」「開発部」「サービス部」のみとする

[1] パスワード要素は文字列型で6文字から12文字まで

まず、新しいデータ型(単純型)を「simpleType要素」を使用して宣言します。作成するデータ型の名前はname属性で指定します。ここでは「passwordType」という名前のデータ型を作成します。

<xs:simpleType name="passwordType">
   :
   :
</xs:simpleType>

次に、制限を表わす「restriction要素」を記述します。そして、どのデータ型を基にしてデータ型を作成するのかをbase属性の値に指定します。パスワード要素のデータ型は基本データ型の文字列型を基に作成しますの
で、base属性の値にはstringを記述します。

<xs:restriction base="xs:string">
   :
   :
</xs:restriction>

続いて、restriction要素の子要素で制約条件を指定します。制約条件は「6文字から12文字まで」です。XML Schemaでは、このような制約条件を「制限ファセット」と呼び、各ファセットの指定値はvalue属性で設定します。制限ファセットには表3のようなものがあります(ただし、ベースとなる型によって使用できる種類が異なります)。

表3:制限ファセットの種類

制限ファセット 意味
length 値の長さを固定する
minLength 値の長さの最小値を指定
maxLength 値の長さの最大値を指定
pattern 正規表現を使用したパターンを指定
enumeration 値の候補値を指定
minInclusive 値の範囲の最小値(指定値を含む)
maxInclusive 値の範囲の最大値(指定値を含む)
minExclusive 値の範囲の最小値(指定値を含まない)
maxExclusive 値の範囲の最大値(指定値を含まない)
whiteSpace 空白文字の正規化
totalDigits 最大桁数を指定
fractionDigits 小数点数以下の最大桁数を指定

パスワード要素は6文字から12文字までですので、値の長さの最小値を指定する「minLength」と値の長さの最大値を指定する「maxLength」の制限ファセットを使用します。

●各ファセットの指定値の設定

<xs:minLength value="6" />
<xs:maxLength value="12" />

ここまでの操作で、最終的にパスワード要素を表わすデータ型は図1のようになります。また、このpasswordType型のパスワード要素の宣言は次のとおりです。

<xs:element name="パスワード" type="passwordType" />

図1:XML Schemaのデータ型の種類

この結果、妥当なXML文書と妥当でないXML文書の例は次のようになります。

●妥当なXML文書

<パスワード>dbmagazine</パスワード>

●妥当でないXML文書

<パスワード>db</パスワード>

[2] 社員番号要素は整数型で1000以上10000未満

この場合、条件は整数で1000以上10000未満であるため、restriction要素のbase属性の値はintを、制限ファセットは指定された値を含む値の範囲の最小値を指定する「minInclusive」と、指定された値を含まない値の範囲の最大値を指定する「maxExclusive」を使用します。

また、minInclusiveとminExclusive、maxInclusiveとmaxExclusiveの違い(表3)は十分に理解しておきましょう。

●制限ファセットの指定値の設定

<xs:restriction base="xs:int">
    <xs:minInclusive value="1000" />
    <xs:maxExclusive value="10000" />
</xs:restriction>

社員番号要素の型は「snoType」という名前にします。最終的なデータ型の定義は次のとおりです。

<xs:simpleType name="snoType">
    <xs:restriction base="xs:int">
      <xs:minInclusive value="1000"/>
      <xs:maxExclusive value="10000"/>
    </xs:restriction>
</xs:simpleType>

また、snoType型の社員番号要素の宣言は次のようになります。

<xs:element name="社員番号" type="snoType" />

この結果、妥当なXML文書と妥当でないXML文書の例は次のようになります。

●妥当なXML文書

<社員番号>1998</社員番号>

●妥当でないXML文書

<社員番号>999</社員番号>
<社員番号>10000</社員番号>

[3] 所属要素は文字列型で「営業部」「開発部」「サービス部」のみ

この場合、記述可能な候補値(営業部、開発部、サービス部)を定義しますので、restriction要素のbase属性の値にはstringを、制限ファセットは値の候補値を指定する「enumeration」を使用します。

●制限ファセットの指定値の設定

<xs:restriction base="xs:string">
    <xs:enumeration value="営業部" />
    <xs:enumeration value="開発部" />
    <xs:enumeration value="サービス部" />
</xs:restriction>

所属要素の型は「belongType」という名前にします。最終的なデータ型の定義は、次のようになります。

<xs:simpleType name="belongType">
<xs:restriction base="xs:string">
    <xs:enumeration value="営業部"/>
      <xs:enumeration value="開発部"/>
      <xs:enumeration value="サービス部"/>
    </xs:restriction>
</xs:simpleType>

このbelongType型の所属要素の宣言は次のとおりです。

<xs:element name="所属" type="belongType" />

この結果、妥当なXML文書と妥当でないXML文書の例は次のようになります。

●妥当なXML文書

<所属>営業部</所属>

●妥当でないXML文書

<所属>人事部</所属>

このように、型の再利用方法や制限ファセットとその意味を理解することで、単純型の制限は簡単に記述できます。

単純型の拡張

「単純型を拡張する」と言うと、基となるデータ型の値の範囲を広げるのだろう、と思われるかもしれませんが、実は属性定義を追加することしかできません。単純型を拡張した場合、そのデータ型は複合型となります。したがって、単純型に属性定義を追加する場合は、単純型を拡張すれば良いことになります。このことを、例を基に見ていきましょう。

【定義例】
商品価格要素は整数値とし、記述できる値は2000以上、5000以下とする。また、商品価格要素は文字型の通貨属性を持つ。

この例は、次の手順で定義していきます。

  • [1] 整数で2000 以上5000 以下という「priceType 型」を作成する
  • [2] priceType型から文字列型の通貨属性を持つ製品価格「goodsPriceType型」を作成する

[1] 整数で2000以上5000以下というpriceType型を作成する

これは、先ほど説明した単純型の制限を利用します。restriction要素と制限ファセットのminInclusive、maxInclusiveを使用します。

<xs:simpleType name="priceType">
  <xs:restriction base="xs:int">
    <xs:minInclusive value="2000"/>
    <xs:maxInclusive value="5000"/>
  </xs:restriction>
</xs:simpleType>

[2] priceType型から文字列型の通貨属性を持つ製品価格goodsPriceType型を作成する

priceType型という単純型に通貨属性を追加しますので、単純型の拡張です。また、この場合単純型の拡張は属性を持ちますので、複合型になります(表2)。実際には、単純型の拡張にはcomplexType要素を使用し、作成するデータ型の名前「goodPriceType」をname属性で指定します。

<xs:complexType name="goodPriceType">
   :
   :
</xs:complexType>

次に、complexType要素の子要素に内容が単純型であることを定義するために、simpleContent要素を指定します。

<xs:simpleContent>
   :
   :
</xs:simpleContent>

続いて、拡張を表わすextension要素を記述し、base属性で基になるデータ型「priceType」を指定します。

<xs:extension base="priceType">
   :
   :
</xs:extension>

最後に通貨属性を指定します。最終的に、goodsPriceType型は図2のようになります。なお、goodsPriceType型の商品価格要素の宣言は次のとおりです。

<xs:element name="商品価格" type="goodsPriceType" />

図2:goodsPriceType型の例

この結果、妥当なXML文書と妥当でないXML文書の例は次のようになります。

●妥当なXML文書

<商品価格通貨="円">2500</商品価格>
<商品価格通貨="ドル">4300</商品価格>

●妥当でないXML文書

<商品価格通貨="円">5200</商品価格>
<商品価格>3500</商品価格>

今月の確認問題

さて、ここまでXML Schemaのデータ型として、単純型の制限と拡張について解説してきましたが、みなさんはしっかり理解できましたか?ここで、今回解説した内容が理解できたかどうかを、確認問題で試してみましょう。

問題1

次のXML Schemaの記述の説明として誤っているものを選択してください。ただし、名前空間接頭辞xsは“http://www.w3.org/2001/XMLSchema”として宣言されているものとします。

<xs:simpleType name="Data_Type">
    <xs:restriction base="xs:int">
      <xs:minExclusive value="20"/>
      <xs:maxInclusive value="200"/>
    </xs:restriction>
</xs:simpleType>
<xs:element name="価格" type="Data_Type"/>

  1. 価格要素では20という値は許されている
  2. 価格要素では23.4という値は許されていない
  3. 価格要素では200という値は許されている
  4. 価格要素では99という値は許されている

解説

simpleType要素とrestriction要素を使用していますので、単純型の制限となるということはお分かりですね。ここで定義されている内容は、整数型が基底の型で、最小値として20を含まず、最大200までの値を記述できることです。このことから、Aの説明は定義されている内容を満たしていませんが、B、C、Dは、定義されている
内容を満たしています。したがって、正解はAとなります。

問題2

単価要素には3500または4500のみが指定できるように正しく定義されているXML Schema文書を選択してください。

  1. <xs:simpleType name="priceType">
        <xs:restriction base="xs:int">
          <xs:minInclusive value="3500"/>
          <xs:maxInclusive value="4500"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="単価" type="priceType"/>
  2.  <xs:simpleType name="priceType">
        <xs:restriction base="xs:int">
          <xs:minExclusive value="3500"/>
        <xs:maxExclusive value="4500"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="単価" type="priceType"/>
  3. <xs:simpleType name="priceType">
        <xs:restriction base="xs:int">
          <xs:enumeration value="3500"/>
          <xs:enumeration value="4500"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="単価" type="priceType"/>
  4. <xs:simpleType name="priceType">
        <xs:restriction base="xs:int">
          <xs:minlength value="3500"/>
          <xs:maxlength value="4500"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="単価" type="priceType"/>

解説

この問題もsimpleType要素とrestriction要素を使用していますので、単純型の制限となります。AはminInclusiveとmaxInclusiveを使用していますので、単価要素に指定できる値は3500以上、4500以下となり、要件を満たしていませんので誤りです。BはminExclusiveとmaxExclusiveを使用していますので、単価要素に指定できる値は3500より大きく、4500より小さい値となり、これも要件を満たしていません。よって誤りです。Cはenumerationを使用していますので、単価要素に指定できる値は3500または4500となり、要件を満たしていますので正解です。Dは、minLengthとmaxLengthを使用しています。基底の型がintの場合、minLength、maxLengthは指定できませんので誤りです。

問題3

次のXML Schema文書に対して、構造が一致しているXML文書を2つ選択してください。

<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="製品" default="パソコン">
   <xs:complexType>
    <xs:simpleContent>
     <xs:extension base="xs:string">
      <xs:attribute name="出荷日" type="xs:date" use="required" />
      </xs:extension>
    </xs:simpleContent>
   </xs:complexType>
  </xs:element>
</xs:schema>

  1. <製品 出荷日="平成18-04-10">ノートパソコン</製品>
  2. <製品出荷日="2006-04-15">マウス</製品>
  3. <製品出荷日="2006-4-20">ハードディスク</製品>
  4. <製品出荷日="2006-04-29"></製品>

解説

XML Schema文書の定義内容から読み取れる情報は次のとおりです。

  • 製品要素は文字データで、デフォルト値が“パソコン”である
  • 製品要素は日付型の出荷日属性を持ち、属性は必ず指定しなければならない

製品名要素には、default属性が設定されていますので、「製品名」要素の内容が記述されていない場合のみ、default属性で設定された値が適用されます。出荷日属性はuse属性でrequiredが指定されていますので、日付型のデータであればどのような内容でも構いません。日付型の書式は、「XXXX-XX-XX(2006-05-12)」です。
よって、正解はB、Dです。

* * *

今回は、XML Schemaにおけるユーザー定義のデータ型を中心に、単純型の制限と拡張について解説しました。特に、図1の単純型の制限方法、表3の制限ファセット、および図2の単純型の拡張方法は十分に理解しておいてください。次回は、複合型の制限と拡張について解説します。


衣笠成一(きぬがさせいいち)

日本ヒューレット・パッカード株式会社HP教育サービス勤務。現在、インフォテリア認定トレーナーとして、XMLトレーニングコースを担当するとともに、大規模Web開発支援コースを含めたITプロフェショナル人材育成プログラムなどにおいて、技術サポートおよびトレーナー支援を行なっている。企業の新人トレーニングと住宅の購入、および引っ越しの時期が重なって大変ですが、あと1回頑張りたいと思っています。


<掲載> P.216-220 DB Magazine 2006 July

ページトップへ▲

XMLマスターポイントレッスン ~ ベーシック編 ~ 記事一覧へ戻る

HOMEへ戻る