XMLSchema的解决方法不支持maxOccurs大于5000

时间:2013-05-20 13:49:31

标签: java xml-parsing xsd xerces jaxp

我的问题在于解析具有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 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

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

有一个FEATURE_SECURE_PROCESSING feature会对maxOccurs(以及其他几个)提出5000限制。

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

答案 2 :(得分:3)

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

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

$ xjc -nv foo.xsd

请注意:

  

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

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

答案 3 :(得分:0)

如果您将 Eclipse IDE 与 Dali 插件用于 JAXB,您可能会在控制台中获得上述错误。

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

Classes Generator Options

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

Classes Generator Extension Configurations

在解析数据以加载 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);