出現順序を問わず、必ず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" ?> |
この場合、<book>要素の配下は、とにかく規定の子要素がそれぞれ1回ずつ記述されていれば、
<book isbn="ISBN4-7981-0189-3"> |
のように記述しても、
<book isbn="ISBN4-7981-0189-3"> |
のように記述しても構いません。例えば、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のファイル名)のみです。スキーマ文書を書いてみるだけでは、スキーマ文書そのものの妥当性を判断できませんが、パーサの処理を介することでスキーマの正否を確認できます。
Copyright © ITmedia, Inc. All Rights Reserved.