検索
連載

XML SchemaでXML文書の妥当性を検証するXMLテクニック集(8)(1/3 ページ)

Share
Tweet
LINE
Hatena

XML SchemaでXML文書の妥当性を検証する

アイコン

XML文書がXML Schemaで定義した構造を正しく反映しているか検証してみます。ここでは、JavaScriptとMSXML 4.0のDOMパーサを使い、XML文書の妥当性をチェックするためのコーディングを紹介します。

カテゴリ DOM
関連要素 XMLSchemaCacheオブジェクト
関連記事 XML Schemaで単純型要素を定義する
XML Schemaで複雑型要素を定義する
XML Schemaで属性ノードを定義する
必要なソフトウェア MSXML 4.0以上

 別稿「XML Schemaで複雑型要素を定義する」「XML Schemaで属性ノードを定義する」ではXML Schemaの基本的な構造定義の方法について学んできました。

 しかし、定義だけを学んでも、いったいこれがどのような処理に結び付くのか、実際の処理サンプルを示さなかったため、実用性が見えにくかったかもしれません。

 XML Schemaは単なる文書定義言語にすぎません。実際にスキーマデータをXML文書と照合し、エラーを出力したり、その後の処理を分岐したりするのは、DOMの役割なのです。

 ここではDOMとJavaScriptを利用して、XML SchemaによるXML文書の検証処理を行ってみます。パーサ(解析エンジン)がXML Schemaを解析し、XML文書との照合までを行ってくれるので、従来のように冗長なチェックロジックを書く必要はありません(チェックロジックのためだけに、これまでつらつらとif命令を書き連ねてきた方ならば、その効果のほどは実感をもって感じられるはずです)。

 照合の結果、XML文書内にスキーマに合致しない不正なデータが含まれていた場合には、ブラウザにエラーが出力されます。なお、ここでは対象となるXML文書とXML Schemaとして、別稿「XML Schemaで属性ノードを定義する」で用いたbook.xmlbook.xsdを利用することにします。

MSXML 4.0のインストール

このサンプルを実行するにはMSXML 4.0をインストールする必要があります。MSXML 4.0のダウンロードサイトへアクセスし、「ダウンロード」をクリックするとダイアログが開くので、「開く」を選択し指示に従ってインストールします。


*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


図 検証の結果、エラーが検出された。date型のデータはYYYY-MM-DDでなければならない
図 検証の結果、エラーが検出された。date型のデータはYYYY-MM-DDでなければならない

 注目してほしいポイントは、以下の部分です。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


 MSXML2.XMLSchemaCacheは、XML Schemaファイルを格納するためのオブジェクトです。new演算子で生成された直後の段階では、単なる空の器だと思っておけばよいでしょう。

 その器に対して、スキーマ文書を追加するのがaddメソッドです。第1引数にはスキーマとXML要素とをマッピングするキーを指定します。この場合、book.xmlの<books>要素(xmlns:〜属性)に記述された値に対応します。第2引数にはマッピングするXML Schemaファイル名を指定します。この記述によって、キー“urn:bookList”で定義された要素の配下は、book.xsdのルールに従わなければなりません。

 ただし、addメソッドはXML Schema文書単体としての属性を指定しているにすぎません。実際にXML文書と関連付けるのは、DOMDocumentオブジェクトのschemasプロパティです。schemasプロパティにbook.xsdを格納したXMLSchemaCacheオブジェクトをセットしたうえで、book.xmlをロードします

 これでbook.xmlとbook.xsdとのひも付けは完了です。book.xmlは、ロード時に自動的にbook.xsdで検証され、その際のエラー情報はDOMParseErrorオブジェクトに格納されます。あとはerrorCodeプロパティ(エラーコード)が0であるか否かで検証エラーの有無を判定します。エラーコードが“0”でない場合、XML文書には何らかのエラーがあったものと見なして、エラー発生行と発生理由とを出力します。

       | 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る