Java SE 6 での RELAX NG スキーマによる妥当性検証
以前の記事で RELAX NG を用いた妥当性検証の実行方法を見ました。 それには、以下のようにして SchemaFactory オブジェクトを取得する必要がありました:
SchemaFactory factory = SchemaFactory.newInstance( XMLConstants.RELAXNG_NS_URI);
ただし、Java SE 6 この方法で SchemaFactory オブジェクトを取得しようとすると例外が投げられます。 原因はこちらの記事のコメント欄を参照。
原因はともかく、妥当性検証を行う方法を見ていきましょう*1。 それには、SchemaFactory オブジェクトを取得する際に、SchemaFactory#newInstance(String, String, ClassLoader) メソッドを用います:
SchemaFactory factory = SchemaFactory.newInstance(
XMLConstants.RELAXNG_NS_URI,
"org.iso_relax.verifier.jaxp.validation.RELAXNGSchemaFactoryImpl",
getClass().getClassLoader());
- 第1引数は SchemaFactory#newInstance(String) メソッドに渡す引数と同じで、スキーマ言語を指定する文字列です
- 第2引数は SchemaFactory の実装クラスのクラス名です
- 第3引数は SchemaFactory の実装クラスをロードするクラスローダです*2
実際には、第2引数のクラス名をコード内にそのまま埋め込むと SchemaFactory の実装が固定されてしまうので、フィールドやシステム・プロパティなどにして外部から設定できるようにしておきましょう。
もしくは、実装が固定されてもいい場合は
SchemaFactory factory = new RELAXNGSchemaFactoryImpl();
のように直接 SchemaFactory の実装クラスである RELAXNGSchemaFactoryImpl のインスタンスを直接生成しても構いません。