いくつかの XML スキーマを生成していますが、ジェネレーターが有効な XML スキーマ ドキュメント (XML ではない) を作成していることを確認したいと考えています。私は XML スキーマ ドキュメントを検証するためのコードを考え出そうとしましたが、惨めに失敗しました。こんなにコンプレックスになるとは思わなかった
private void validateXsd( String xsdAsString ) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
factory.setFeature( "http://apache.org/xml/features/validation/schema", true );
SchemaFactory schemaFactory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
URL xmlSchemaXSD = this.getClass().getClassLoader().getResource( "com/metamodel/xsd/XMLSchema.xsd" );
URL xmlSchemaDTD = this.getClass().getClassLoader().getResource( "com/metamodel/xsd/XMLSchema.dtd" );
URL xmlSchemaDataTypes = this.getClass().getClassLoader().getResource( "com/metamodel/xsd/datatypes.dtd" );
// requires that XMLSchema.dtd and datatypes.dtd are present in the same directory with the XMLSchema.xsd.
factory.setSchema( schemaFactory.newSchema( xmlSchemaXSD ) );
SAXParser parser = factory.newSAXParser();
// parser.setProperty( "http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema" );
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler( new SimpleErrorHandler() );
reader.parse( new InputSource( IOUtils.toInputStream( xsdAsString ) ) );
} catch( SAXParseException e ) {
e.printStackTrace( System.err );
} catch ( ParserConfigurationException e ) {
e.printStackTrace( System.err );
} catch ( SAXException e ) {
e.printStackTrace( System.err );
} catch ( IOException e ) {
e.printStackTrace( System.err );
}
}
このコードは、私が必要としているものにかなり近いですが、次のエラーが発生しています。
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'jar:file:/r:/as4ot/lib/metamodel.jar!/com/metamodel/xsd/XMLSchema.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2245)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchema(XSDHandler.java:1590)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:438)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:556)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:523)
at com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl.newSchema(SchemaFactoryImpl.java:206)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:489)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:521)
XMLSchema.dtd と datatypes.dtd が相対的であることを確認するために setSchema( uri ) を呼び出すときに URL を使用しており、それらが利用可能であることを願っていますが、これを確認する方法がわかりません。
XMLSchema.xsd、XMLSchema.dtd、および datatypes.dtd が私の jar にバンドルされているため、クラスローダーによってロードされるという事実が気に入らないと思います。org.xml.sax.SAXParseException : src-resolve: Cannot resolve the name 'xml:lang' to a(n) 'attribute Declaration' component. jar の外部のディレクトリ パスから XMLSchema をロードしたときと同じように動作すると仮定します。
私の目標は次のとおりです。
- XMLSchema.xsd を jar 内からロードして、コードと一緒にきちんとパッケージ化します。
- xml:lang に関する次のエラーを回避します。
うまくいけば、私はあまり求めていません!
ありがとう、スチュアート