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

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

[山田祥寛,@IT]

XML Schemaで一意キーとなる要素・属性を定義する

アイコン

特定の要素・属性を一意に特定したい場合には、<xsd:unique>要素、<xsd:selector>要素、<xsd:field>要素を用いて一意キーを設定します。これで、データベースの「主キー」と同じ効果を得られます。

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

 別稿「XML Schemaで文字列パターンを定義する」のbooks.xmlを参照してみてください。<book>要素におけるisbn属性のように、書籍情報データを一意に特定するキー(データベースでいうところの「主キー」)を定義したいというケースは決して少なくありません。

 そのようなときに、XML Schemaでは<xsd:unique>要素を用いることで、ドキュメント内で一意なキーを定義できます。具体的な例を見てみましょう。なお、対象となるXML文書は、別稿「XML Schemaで文字列パターンを定義する」で用いたbooks.xmlを使用します。

books_unique.xsd

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="books" type="books_type">
    <xsd:unique name="isbnCode">
      <xsd:selector xpath="book" />
      <xsd:field xpath="@isbn" />
    </xsd:unique>
  </xsd:element>
  <xsd:complexType name="books_type">
    <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: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:sequence>
    <xsd:attribute name="isbn" type="xsd:string"
        use="required" />
  </xsd:complexType>
</xsd:schema>


 特定のノードに対して、一意キーの制約条件を定義する一般的な構文は、以下のとおりです。

<xsd:element name="要素名" type="元となるデータ型">
  <xsd:unique name="一意キー名">
    <xsd:selector xpath="基点となるノード" />
    <xsd:field xpath="一意キーを表すノード" />
  </xsd:unique>
</xsd:element>


 <xsd:selector>要素は、一意キーの基点となるノードをカレントノードからの相対的なパスで表します。つまり、上記の例では<books>要素を定義しているわけですから、「xpath="book"」とした場合、<books>要素直下の<book>要素を表します。<xsd:field>要素には、実際の一意キーを表すノードを指定します。つまり、この場合は@isbn(isbn属性)です。この指定によって、books.xml内でisbn属性は一意でなければならないことになります。

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


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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