連載
» 2003年12月10日 10時00分 UPDATE

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

[山田祥寛,@IT]

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


[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でなければならない 図 検証の結果、エラーが検出された。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文書には何らかのエラーがあったものと見なして、エラー発生行と発生理由とを出力します。

       1|2|3 次のページへ

Copyright© 2015 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

人気のSIMロックフリー端末「Nexus 6」をプレゼント
Loading

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

注目のテーマ

転職/派遣情報を探す

【転職サーチ】SIer/Web企業/新規事業 スマホ開発で、あなたのキャリアを生かす

「派遣・フリーで働くメリット」とは? 活躍する派遣エンジニアの本音

RSSについて

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

メールマガジン登録

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