前回は 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 の場合との違いは以下の通り: