java w3c xml_java – 针对W3C XML模式定义验证XSD

我正在生成一些XML Schema,并希望确保我们的生成器正在创建有效的XML Schema文档(非XML).我试图提出验证XML Schema文档的代码,但是失败了.我不认为这会很复杂.

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 .

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)

我在调用setSchema(uri)时使用URL来确保XMLSchema.dtd和datatypes.dtd是相对的,我希望它们可用,但我不确定如何检查它.

我猜它不喜欢XMLSchema.xsd,XMLSchema.dtd和datatypes.dtd捆绑在我的jar中并因此由类加载器加载的事实.无论如何要解决这个问题,以便我可以进入下一个障碍,即org.xml.sax.SAXParseException:src-resolve:无法将名称’xml:lang’解析为(n)’属性声明’组件.假设它的行为与从jar外部的目录路径加载XMLSchema时的行为相同.

我的目标是:

>从jar内部加载XMLSchema.xsd,使其与代码整齐地打包在一起.

>获取有关xml:lang的下一个错误.

希望我不要求太多!

谢谢,

斯图尔特

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值