gpt4 book ai didi

java - 根据 W3C XML 模式定义验证 XSD

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:26 24 4
gpt4 key购买 nike

我正在生成一些 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)

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

我猜它不喜欢 XMLSchema.xsd、XMLSchema.dtd 和 datatypes.dtd 捆绑在我的 jar 中并因此被类加载器加载的事实。有没有办法解决这个问题,以便我可以进入下一个障碍,即 org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'xml:lang' to a(n) 'attribute declaration'组件。 假设它的行为与我从 jar 外部的目录路径加载 XMLSchema 时的行为相同。

我的目标是:

  • 从 jar 中加载 XMLSchema.xsd,以便它与代码整齐地打包在一起。
  • 克服下一个关于 xml:lang 的错误。

希望我没有要求太多!

谢谢,斯图尔特

最佳答案

出于几个原因,我不会使用您描述的方法验证 XSD,其中最重要的一个原因是 XSD 作为一种语言很弱,因此它本身并没有包含完整的规范。因此,您很可能会验证实际上无效的内容。

对于 XSD 验证,您有专门的处理器; Java 有 XSOM ;按照user guide .

关于java - 根据 W3C XML 模式定义验证 XSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com