setSchemaで例外
最近XML SchemaでXML文章の検証ってのをJava上でやっている。数年前のプロジェクトのメンテナンス+新機能追加って感じのプロジェクトなので新旧いろんなのが混じってる。
さて本題。XMLのパースにはSAXを使ってる。XML Schemaを使うには大体こんな感じ。
// Schemaオブジェクトの作成
SchemaFactory sf =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
sf.setErrorHandler(new MyErrorHandler()); // *1
Source schemaFile = new StreamSource(new File(“schema.xsd”));
Schema schema = sf.newSchema(schemaFile);
// パーサーの作成
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setSchema(schema);
SAXParser parser = factory.newSAXParser();
SchemaFactory sf =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
sf.setErrorHandler(new MyErrorHandler()); // *1
Source schemaFile = new StreamSource(new File(“schema.xsd”));
Schema schema = sf.newSchema(schemaFile);
// パーサーの作成
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setSchema(schema);
SAXParser parser = factory.newSAXParser();
*1 MyErrorHandlerはDefaultHandlerをオーバーライド
これで普通に動いてたんだけど、antでビルドしてパッケージ作って起動すると、factory.setSchema(schema)の行で以下の例外が…
java.lang.UnsupportedOperationException: This parser does not support spe
cification “null” version “null”
cification “null” version “null”
結論から言うと、SAXParserFactoryが古いJAXPを使おうとしているかららしく、以下のようなファイルをclasspathから取り除けばokらしい。
jaxp.jar
xerces-2.6.2.jar
crimson.jar
xalan.jar
なんで、そんな事が起きたかというと、build.xmlでクラスパスを指定するところで、
>include name=”${hibernate.dir}/**/*.jar” /<
>include name=”${hibernate-annotations.dir}/**/*.jar” /<
>include name=”${hibernate-annotations.dir}/**/*.jar” /<
と横着したからでした。
参考になったのはここ(英語)。