8

我的问题是解析具有maxOccurs大于 5000(但不是unbounded)的元素的 XSD 架构。

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

我已经知道,如果我将 XSD 中的 maxOccurs 数字从大于 5000 的数字更改为unbounded一切正常。可悲的是,这不是我的选择(我不能干预 XSD 文件)。

我的问题是:

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

谢谢!

4

4 回答 4

14

我有同样的问题。我用这个:

System.setProperty("jdk.xml.maxOccurLimit", "XXXXX");
于 2014-10-29T10:32:49.227 回答
8

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

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

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

于 2013-05-22T12:37:45.293 回答
6

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

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

$ xjc -nv foo.xsd

但请注意:

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

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

于 2017-05-24T17:37:38.150 回答
0

如果您将 Eclipse IDE 与 Dali 插件用于 JAXB 一起使用,您可能会在控制台中收到上述错误。

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

类生成器选项

添加@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);
于 2021-04-07T14:34:42.443 回答