連載
» 2004年04月20日 10時00分 公開

XMLテクニック集(12):XML Schemaで値の有効範囲を定義する (3/3)

[山田祥寛,@IT]
前のページへ 1|2|3       

XML Schemaで順不同の出現を定義する

アイコン

出現順序を問わず、必ず1回は登場するような制約を定義するには、<xsd:all>要素を利用します。このような制約はDTDでは実現できなかったものです。

カテゴリ XML Schema
関連要素 <xsd:all>
関連記事 XML Schemaで複雑型要素を定義する
XML Schemaで文字列パターンを定義する

 別稿「XML Schemaで複雑型要素を定義する」では、<xsd:sequence>要素を利用することで、必ず指定された順番で登場しなければならない要素モデルを紹介しました。しかし、順番は構わないから、とにかく各要素とも1回は登場しなければならないという定義はどうしたらよいのでしょう。

 実は、DTD(Document Type Definition)では、このような規定はできませんでした。いちばん近い表現を採用するならば、

<!ELEMENT book (title | author | price | ...)+>


のように書けるかもしれませんが、この場合には、<book>要素配下の各要素はいずれか1つが1回以上登場すればよいという極めて緩い制約条件となってしまいます。

 しかし、XML Schemaでは<xsd:all>要素を使用することで、DTDでは表現できなかった「順番にこだわらない、登場頻度だけを規定する」要素モデルを表現することが可能になっています。

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

books_all.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:all>
      <xsd:element name="title" type="xsd:string" />
      <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:all>
    <xsd:attribute name="isbn" type="xsd:string"
      use="required" />
  </xsd:complexType>
</xsd:schema>


 この場合、<book>要素の配下は、とにかく規定の子要素がそれぞれ1回ずつ記述されていれば、

<book isbn="ISBN4-7981-0189-3">
  <publishDate>2002-05-17</publishDate>
  <category>JSP&サーブレット</category>
  <keywords>JSP サーブレット Tomcat J2SE</keywords>
  <price>2800</price>
  <author>Y.Yamada</author>
  <title>10日でおぼえるJSP/サーブレット入門教室</title>
  <published>翔泳社</published>
</book>


のように記述しても、

<book isbn="ISBN4-7981-0189-3">
  <price>2800</price>
  <title>10日でおぼえるJSP/サーブレット入門教室</title>
  <published>翔泳社</published>
  <author>Y.Yamada</author>
  <keywords>JSP サーブレット Tomcat J2SE</keywords>
  <publishDate>2002-05-17</publishDate>
  <category>JSP&サーブレット</category>
</book>


のように記述しても構いません。例えば、DOM(Document Object Model)で要素名ベースでXML文書を処理するようなアプリケーションの場合、要素の登場順序はあまり関係ありませんので、このようなモデルを採用できます(もちろん、無理に使う必要はありません。データのフォーマットは、極力、統一されていた方が好ましいのは間違いありません)。

 また、応用的な用法ですが、<xsd:all>要素配下の子要素の登場回数を規定したいという場合には、

<xsd:all maxOccurs="1" minOccurs="0">


のように記述できます。この場合、<xsd:all>要素で規定された要素の内容は「すべて」1回も登場しないか、「すべて」1回登場する必要があります。一部の子要素が欠けている場合には、不完全な要素であると見なされ、エラーとなりますので、注意してください。一部の子要素を選択的に登場させるようなモデルを作成したい場合には、<xsd:choice>要素を使用してください(別稿「XML Schemaで要素のゆらぎを表現する」を参照)。また、<xsd:all>要素(MSXML4の場合)において、maxOccurs属性は常に1、minLength属性は0か1であり、<xsd:element>要素などのように任意の整数や特別な定数値「unbounded」は指定できませんので、注意してください。

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


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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