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

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

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

山田祥寛
2003/12/10

 別稿「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のダウンロードサイトへアクセスし、「ダウンロード」をクリックするとダイアログが開くので、「開く」を選択し指示に従ってインストールします。


[schema.html]

<html>
<head>
<title>XML SchemaによるXML文書の検証</title>
<script language="JavaScript">
<!--
function chk(){
  var objXml=new ActiveXObject("MSXML2.DOMDocument.4.0");
  objXml.async=false;
  var objScm=new ActiveXObject("MSXML2.XMLSchemaCache.4.0");
  objScm.add("urn:bookList","book.xsd");
  objXml.schemas=objScm;
  objXml.load("book.xml");
  var objErr=objXml.parseError;
  if(objErr.errorCode!=0){
    strMsg=objErr.line + "行 " + objErr.srcText + "<br />";
    strMsg+=objErr.reason;
    document.write(strMsg);
  }else{
    document.write("XML文書はスキーマに従っています");
  }
}
//-->
</script>
</head>
<body onload="chk()">
</body>
</html>

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

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

var objScm=new ActiveXObject("MSXML2.XMLSchemaCache.4.0");
objScm.add("urn:bookList","book.xsd");
objXml.schemas=objScm;
objXml.load("book.xml");

 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文書には何らかのエラーがあったものと見なして、エラー発生行と発生理由とを出力します。

 

「XMLテクニック集」

TechTargetジャパン

XML & SOA フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ

- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る
- PR -

ホワイトペーパーTechTargetジャパン

ソリューションFLASH

「ITmedia マーケティング」新着記事

マーケティング業務“精緻化”の流れを決定付ける――Marketo 取締役 若松幸太郎氏らインタビュー
先日、Marketo 取締役 若松幸太郎氏と電通イーマーケティングワン 第二営業本部 アカウン...

ビッグデータ活用で、期待の高いマーケティングの主要5分野はこれだ
マーケティングにおけるビッグデータの役割と効果について議論された米国でのイベント内...

マインドフリー、Facebook広告の効果的な運用を支援する「ADHub(アドハブ)」の提供を開始
マインドフリーは4月14日、Facebook広告運用支援ツール「ADHub(アドハブ)」の提供を始...