XML Schemaで空要素を定義する
ある要素の配下に子要素やテキストを持たせない制約を設けるには、<xsd:element>要素の配下に、空の<xsd:complexType>要素を記述します。空要素に属性値のみを持たせたい場合には<xsd:attribute>のみを記述します。
カテゴリ | XML Schema | |
関連要素 | <xsd:complexType> | |
関連記事 | XML Schemaでnull値の許容を定義する |
これまで、配下に子要素を含む要素や配下にテキストを含む要素の定義方法について解説してきました。しかし、要素ノードには、例えば、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のように、子要素もテキストも配下に持たないものがあります。これまでの要素定義では、厳密にこうした要素ノードを定義することはできませんでした。例えば、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のように定義した場合、<title>要素配下には何も書かないこと「も」できますが、任意のテキストを含むこと「も」可能です。つまり、何も「書くべきではない」ことを規定することは、これまでの方法では実現できなかったわけです。
そこで本稿では、要素ノードが「空要素」であることを保証する方法について紹介しましょう。対象となるXML文書は、別稿「XML Schemaで文字列パターンを定義する」で用いたbooks.xmlを使用します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
以下の部分に注目してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
空要素を記述するには、<xsd:element>要素の配下に、空の<xsd:complexType>要素を記述するだけでOKです。<xsd:complexType>要素が空だからといって空要素の記述を省略すると、該当要素の配下には「任意のテキスト」が指定できることになってしまいますので、注意してください。空の<xsd:complexType>要素を明示的に記述することは、要素が空であることを明示的に宣言することになるのです。
上記の例の場合、XML文書には、以下のような<cdrom>要素のみを記述できます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
空要素に属性値のみを持たせたい場合には、以下のように記述することも可能です(おそらくこちらの用途の方がより現実的でしょう)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
この場合、XML文書には、以下のような<cdrom>要素を記述できます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
実際に、妥当性検証を行いたい場合には、別稿「XML SchemaでXML文書の妥当性を検証する」のサンプルを参考にするとよいでしょう。変更個所は、XMLSchemaCache.addメソッドの第2引数(XML Schemaのファイル名)のみです。スキーマ文書を書いてみるだけでは、スキーマ文書そのものの妥当性を判断できませんが、パーサの処理を介することでスキーマの正否を確認できます。
Copyright © ITmedia, Inc. All Rights Reserved.