倭マン's BLOG

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

Java SE 6 で RELAX NG での妥当性検証をする場合の注意

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インスタンスを直接生成しても構いません。

*1:Java SE 6 から導入された java.util.ServiceLoader クラスを用いて SchemaFactory オブジェクトを取得する方法もあります。 方法はそのうちに。

*2:static メソッド内などでは Xxx.class.getClassLoader() などとしなければいけません。