【问题标题】:Workaround for XMLSchema not supporting maxOccurs larger than 5000XMLSchema 的解决方法不支持 maxOccurs 大于 5000
【发布时间】:2013-05-15 02:22:13
【问题描述】:

我的问题是解析一个 XSD 架构,它的元素的 maxOccurs 大于 5000(但不是 unbounded)。

这实际上是 Xerces(我正在使用,版本 2.9.1)或 JAXP 中的一个已知问题,如下所述:http://bugs.sun.com/view_bug.do;jsessionid=85335466c2c1fc52f0245d20b2e?bug_id=4990915

我已经知道,如果我将 XSD 中的 maxOccurs 数字从大于 5000 的数字更改为 unbounded,一切正常。遗憾的是,这不是一个选项,就我而言(我不能干预 XSD 文件)。

我的问题是:

  • 有人知道 Xerces 中针对此问题的其他解决方法吗?或者
  • 谁能推荐另一个没有此限制的 XML 解析器?

谢谢!

【问题讨论】:

  • 那个错误报告说实际限制是 2147483647。
  • Xerces 中加载模式时解析方法抛出的异常明确指出:FATAL : org.xml.sax.SAXParseException: Current configuration of the parser doesn't allow a maxOccurs attribute value to be set greater than the value 5,000.
  • 注意“当前配置”一词,不要将“配置”与“实施”混淆。
  • 你说得对,对我来说是配置问题。

标签: java xml-parsing xsd xerces jaxp


【解决方案1】:

我找到了一个不需要更改解析器的解决方案。

有一个 FEATURE_SECURE_PROCESSING feature 将 5000 限制为 maxOccurs(以及其他几个)。

这里是描述限制的文档:http://docs.oracle.com/javase/7/docs/technotes/guides/xml/jaxp/JAXP-Compatibility_160.html#JAXP_security

【讨论】:

  • 你说得对,我更新了它们。第二个链接文章的新版本不再提到5000的限制(我认为只有64000的限制和不同的东西),但是已经四年了,也许事情已经改变了。
  • 示例代码:SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); schemaFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.FALSE);
【解决方案2】:

我遇到了同样的问题。我用这个:

System.setProperty("jdk.xml.maxOccurLimit", "XXXXX");

【讨论】:

【解决方案3】:

在控制台中使用xjc 命令时,我在寻找此问题的解决方案时遇到了这个线程。

对于使用xjc 命令解析 xsd 的任何人,这对我有用:

$ xjc -nv foo.xsd

请注意:

默认情况下,XJC 绑定编译器会在处理源模式之前对其进行严格验证。使用此选项禁用严格的模式验证。这并不意味着绑定编译器不会执行任何验证,而是意味着它将执行不太严格的验证。

因此,如果您认为您的 xsd 来源良好,那么使用不太严格的验证应该不是问题。

【讨论】:

  • 如果我使用以下代码,我会收到错误消息。我能做什么? jaxb:extensionBindingPrefixes) 它在受限中是不允许的模式。
【解决方案4】:

如果您使用带有 JAXB 的 Dali 插件的 Eclipse IDE,您可能会在控制台中收到上述错误。

如果在从 XSD 文件建立 JAXB 生成选项时,取消选中面板“类生成器选项”上的“使用严格验证”,则可以避免此类错误。 该面板是继“Java Project”和“Generate classes from Schema”之后的第三个面板。

添加@minjun-yu 建议的附加参数 -nv 也可以。您可以在标有“类生成器扩展配置”的第四个面板中设置此类参数,而不是应用我的第一个建议

在解析数据以加载 JAXB 生成的类时,如果您针对模式进行验证,您仍然可能会获得 SAXException。正如@mzywiol 和@marioosh 所指出的,在创建SchemaFactory 时设置特殊功能可以避免异常

    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    // Avoid SAXParseException on maxOccurs > 5000 
    sf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false); 
    
    URL xsdURL = TestParse.class.getResource(xsdLocation);
    Schema schema = sf.newSchema(xsdURL);

    JAXBContext ctx = JAXBContext.newInstance(MyJAXBClass.class.getPackage().getName());

    Unmarshaller unmarshaller = ctx.createUnmarshaller(); 
    unmarshaller.setSchema(schema);

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 2023-02-20
    • 2010-12-07
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多