我的问题在于解析具有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文件)。
我的问题是:
谢谢!
答案 0 :(得分:10)
我遇到了同样的问题。我用过这个:
System.setProperty("jdk.xml.maxOccurLimit", "XXXXX");
答案 1 :(得分:6)
我找到了一个不需要更改解析器的解决方案。
有一个FEATURE_SECURE_PROCESSING
feature会对maxOccurs(以及其他几个)提出5000限制。
答案 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'之后的第三个面板。
添加@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);