連載
» 2004年03月17日 10時00分 公開

XMLテクニック集(11):XML Schemaで一意キーとなる要素・属性を定義する (2/3)

[山田祥寛,@IT]

XML Schemaで要素のゆらぎを表現する

アイコン

複数の要素のどれかが登場すれば妥当と定義することで、データ項目の「ゆらぎ」を表現できます。<xsd:choice>要素の配下に、登場すべき要素あるいは要素モデルを列挙します。

カテゴリ XML Schema
関連要素 <xsd:choice>
関連記事 XML Schemaで要素モデルを定義する
XML Schemaで選択型の値を定義する

 XML文書を扱う場合、必ずしも最初からきちんとしたスキーマが規定されているケースばかりではありません。最初は、個々に異なるXML文書がやりとりされていて、後からスキーマの統一が図られるというケースも決して少なくはないのです。

 そのようなときに、異なる要素名で同じ内容のデータがやりとりされていたとしたらどうでしょう。例えば、同じ書名を表しているのに、あるところでは<name>要素で定義しており、別のところでは<title>要素が使われているようなケースです。もちろん、最終的にはいずれかに統一するのがよりよい解決方法であるといえますが、バックエンドに控えるシステムの関係でなかなか簡単には変更できないという状況も考えられます。

 そのような場合にも、XML Schemaではデータ項目の「ゆらぎ」を表現できます。つまり、<name>、<title>要素いずれか片方が含まれていればよいというようなあいまいなモデルパターンの定義です。

 具体的な例を見てみることにしましょう。なお、対象となるXML文書は、別稿「XML Schemaで文字列パターンを定義する」で用いたbooks.xmlを使用します。

books_choice.xsd

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="books">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="book" type="book_type"
            minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
      <xsd:attribute name="name" type="xsd:string"
          use="required" />
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="book_type">
    <xsd:sequence>
      <xsd:choice>
        <xsd:element name="name" type="xsd:string" />
        <xsd:element name="title" type="xsd:string" />
      </xsd:choice>

      <xsd:element name="author" type="xsd:string" />
      <xsd:element name="published" type="xsd:string" />
      <xsd:element name="price" type="xsd:positiveInteger" />
      <xsd:element name="publishDate" type="xsd:date" />
      <xsd:element name="category" type="xsd:string" />
      <xsd:element name="keywords" type="xsd:string" />
    </xsd:sequence>
    <xsd:attribute name="isbn" type="xsd:string" use="required" />
  </xsd:complexType>
</xsd:schema>


 定義そのものは実に単純です。

<xsd:choice>
  要素モデル
</xsd:choice>


 <xsd:choice>要素の配下に、選択的に登場すればよい要素を列挙するだけです。いくつかの要素ノードを含む「要素モデル」単位でゆらぎを定義したい場合には、<xsd:element>要素の代わりに<xsd:any>、<xsd:group>、<xsd:sequence>要素を記述することも可能です。

 また、<xsd:choice>要素にはmaxOccurs、minOccurs属性を記述することも可能です。デフォルトではいずれの属性も1ですので、配下に定義された要素(モデル)の中から選択的にいずれか1つが登場する必要があります。

 もし、maxOccurs属性がunbounded(無限)、minOccurs属性が1だったら、<xsd:choice>要素配下の要素(モデル)を無作為に1個以上記述することが可能です。登場する順番などは問いません。

<xsd:choice maxOccurs="unbounded" minOccurs="1">
  <xsd:element name="name" type="xsd:string" />
  <xsd:element name="title" type="xsd:string" />
</xsd:choice>


 DTDでいうならば、これは以下と同意です。

<!ELEMENT book((name|title)+ ,……)>


実際に、妥当性検証を行いたい場合には、別稿「XML SchemaでXML文書の妥当性を検証する」のサンプルを参考にするとよいでしょう。変更個所は、XMLSchemaCache.addメソッドの第2引数(XML Schemaのファイル名)のみです。スキーマ文書を書いてみるだけでは、スキーマ文書そのものの妥当性を判断できませんが、パーサの処理を介することでスキーマの正否を確認できます。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。