倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

javax.xml.validation で RELAX NG を使う

前回W3C XML Schema を使って XML 文書の妥当性検証を行う方法を見ました。 ただし、 javax.xml.validation パッケージに定義されてあるクラス群は、スキーマ言語によらない妥当性検証の方法を提供することができます。 今回はそれなりに用いられるスキーマ言語RELAX NG を用いて妥当性検証を行う方法を見ていきます。

必要なライブラリ


JDK には RELAX NG を用いて妥当性検証を行うクラスが同伴されていないので (JDK の実装によるのかもしれませんが)、実際にその処理を行うライブラリを使用できるようにしなければなりません。

ライブラリは幾つかあるのかもしれませんが、ここでは1組だけを紹介。 まず、javax.xml.validation パッケージができる前に同様の役割をしていた msv (multi schema validator) とその関連のライブラリ

  • msv
  • isorelax
  • relaxngDatatype
  • xsdlib

が必要です。 それに加えて、msv と javax.xml.validation パッケージをブリッジする

  • isorelax-jaxp-bridge

の5つのライブラリ(JAR ファイル)を CLASSPATH に含めましょう。

妥当性検証の実行方法


Schema オブジェクトが取得できれば、後は前回W3C XML Schema の場合と同じように妥当性検証を行えます。 したがって、ここでは RELAX NG ファイルから Schema オブジェクトを取得する方法を見ていきます。 流れは W3C XML Schema ファイルから Schema オブジェクトを取得する方法と同じです。

"test.rng" に RELAX NG スキーマ定義が書いてある場合、以下のようにします*1

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
...

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
Schema schema = factory.newSchema(new StreamSource("test.rng"));

W3C XML Schema の場合との違いは以下の通り:

  • SchemaFactory のインスタンスを取得する際に SchemaFactory#newInstance() メソッドに指定する文字列を "XMLConstants.RELAXNG_NS_URI" (値は RELAX NG 名前空間 "http://relaxng.org/ns/structure/1.0") にする
  • SchemaFactory#newSchema() に指定する Source オブジェクトに RELAX NG ファイル(RELAX NG スキーマ定義)を指定する

*1:このサンプルは、JDK 1.5 では動作しますが、JDK 1.6 では動作しません。 詳しくはこちらの記事のコメント欄を参照。