当前位置: 首页 > 面试题库 >

根据W3C XML架构定义验证XSD

宗政德宇
2023-03-14
问题内容

我正在生成一些XML模式,并希望确保我们的生成器正在创建有效的XML模式文档(不是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 <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:无法将名称“ xml:lang”解析为一个(n)“属性声明”组件。
假设它的行为与我从jar外部的目录路径加载XMLSchema时的行为相同。

我的目标是:

  • 从jar内加载XMLSchema.xsd,使其与代码整齐地打包在一起。
  • 克服有关xml:lang的下一个错误。

希望我不要问太多!

谢谢,斯图尔特


问题答案:

由于种种原因,我不会使用您描述的方法来验证XSD,最重要的一个原因是XSD作为一种语言很弱,因此它本身无法捕获完整的规范。因此,很可能您可以验证实际上无效的内容。

对于XSD验证,您具有专门的处理器;Java有XSOM ;
遵循用户指南。



 类似资料:
  • 我在IBM Integration Bus中工作,我发现自己需要对收到的消息进行验证。由于IIB在这方面不支持任何类型的验证,我想知道是否有任何外部库可以为我验证这些消息。 到目前为止,我发现了这个https://github.com/swagger-api/swagger-inflector/blob/master/README.md#payload-但我想知道是否有其他选择可以更好地满足我的需

  • 问题内容: 我正在尝试针对许多不同的模式(对人为的示例表示歉意)来验证XML文件: xsd 格式 格式 c.xsd特别是导入b.xsd和b.xsd导入a.xsd,使用: 我正在尝试通过Xerces以以下方式执行此操作: 但这无法正确导入所有三个架构,导致无法将名称“ blah”解析为一个(n)“ group”组件。 我已经使用 Python 成功地验证了这一点,但是 Java 6.0 和 Xerc

  • 问题内容: 我使用Swagger定义创建了REST API,现在我需要使用该Swagger模式验证传入消息。我发现了几种解决方案,但是它们都依赖于某些特定的用例。最接近我需要的是它,并且按照它的描述,它可以与提供的json模式一起很好地工作,但是当我提供更复杂的swagger定义时,它只是将所有内容标记为有效。我的问题是。是否有更好,更完整或胜任的解决方案库,可以根据Swagger定义本地验证给定

  • 我使用Swagger定义创建了一个REST API,现在我需要使用该swagger模式验证传入的消息。我找到了几种解决方案,但是它们都依赖于一些特定的用例。最接近我需要的是这个,并且与它的描述相吻合,它可以很好地与提供的json模式配合使用,但是当我提供更复杂的swagger定义时,它只是将所有内容标记为有效。我的问题是。有没有更好、更完整或更有能力的解决方案,也许是库,可以根据Swagger定义

  • 我对XML非常陌生,我面临着验证问题,如果我的XML和XSD文件结构良好,我也希望得到一些反馈。 在根据XSD验证XML时,我经常遇到错误- 下面的XML XSD 如果你发现其中任何一个有任何错误,请随时指出。它们都有从图案到最大长度的限制。 谢谢!!!!

  • 表单验证发生在数据验证之后。如果你需要定制化这个过程,有几个不同的地方可以修改,每个地方的目的不一样。表单处理过程中要运行三种类别的验证方法。它们通常在你调用表单的is_valid() 方法时执行。还有其它方法可以触发验证过程(访问errors 属性或直接调用full_clean() ),但是通用情况下不需要。 一般情况下,如果处理的数据有问题,每个类别的验证方法都会引发ValidationErr