連載
» 2004年05月26日 10時00分 公開

XMLテクニック集(13):XML Schemaで空要素を定義する (1/3)

[山田祥寛,@IT]

XML Schemaで空要素を定義する

アイコン

ある要素の配下に子要素やテキストを持たせない制約を設けるには、<xsd:element>要素の配下に、空の<xsd:complexType>要素を記述します。空要素に属性値のみを持たせたい場合には<xsd:attribute>のみを記述します。

カテゴリ XML Schema
関連要素 <xsd:complexType>
関連記事 XML Schemaでnull値の許容を定義する

 これまで、配下に子要素を含む要素や配下にテキストを含む要素の定義方法について解説してきました。しかし、要素ノードには、例えば、

<img src="//image.itmedia.co.jp/ait/articles/0405/26/wings.jpg" />


のように、子要素もテキストも配下に持たないものがあります。これまでの要素定義では、厳密にこうした要素ノードを定義することはできませんでした。例えば、

<xsd:element name="title" />


のように定義した場合、<title>要素配下には何も書かないこと「も」できますが、任意のテキストを含むこと「も」可能です。つまり、何も「書くべきではない」ことを規定することは、これまでの方法では実現できなかったわけです。

 そこで本稿では、要素ノードが「空要素」であることを保証する方法について紹介しましょう。対象となるXML文書は、別稿「XML Schemaで文字列パターンを定義する」で用いたbooks.xmlを使用します。

books_empty.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: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:element name="cdrom" minOccurs="0" maxOccurs="1">
        <xsd:complexType>
        </xsd:complexType>
      </xsd:element>

    </xsd:sequence>
    <xsd:attribute name="isbn" type="xsd:string"
                   use="required" />
  </xsd:complexType>
</xsd:schema>


 以下の部分に注目してください。

<xsd:element name="cdrom" minOccurs="0" maxOccurs="1">
  <xsd:complexType>
  </xsd:complexType>
</xsd:element>


 空要素を記述するには、<xsd:element>要素の配下に、空の<xsd:complexType>要素を記述するだけでOKです。<xsd:complexType>要素が空だからといって空要素の記述を省略すると、該当要素の配下には「任意のテキスト」が指定できることになってしまいますので、注意してください。空の<xsd:complexType>要素を明示的に記述することは、要素が空であることを明示的に宣言することになるのです。

 上記の例の場合、XML文書には、以下のような<cdrom>要素のみを記述できます。

<cdrom />


 空要素に属性値のみを持たせたい場合には、以下のように記述することも可能です(おそらくこちらの用途の方がより現実的でしょう)。

<xsd:element name="cdrom" minOccurs="0" maxOccurs="1">
  <xsd:complexType>
    <xsd:attribute name="flag" type="xsd:boolean"
                   default="true" />
  </xsd:complexType>

</xsd:element>


 この場合、XML文書には、以下のような<cdrom>要素を記述できます。

<cdrom flag="true" />


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


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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