Java XMLSchema不支持大于5000的maxOccurs的变通方法
我的问题是解析包含Java XMLSchema不支持大于5000的maxOccurs的变通方法,java,xml-parsing,xsd,xerces,jaxp,Java,Xml Parsing,Xsd,Xerces,Jaxp,我的问题是解析包含maxOccurs大于5000的元素(但不是无界的)的XSD模式 这实际上是Xerces(我使用的是2.9.1版)或JAXP中的一个已知问题,如下所述: 我已经知道,如果我将XSD中的maxOccurs数字从大于5000的数字更改为无界的,所有这些都可以正常工作。不幸的是,在我的情况下,这不是一个选项(我不能干预XSD文件) 我的问题是: 有人知道Xerces针对这个问题的其他解决方法吗?或 有人能推荐另一个没有这个限制的XML解析器吗 谢谢 我找到了一个不需要更改解析器的
maxOccurs
大于5000的元素(但不是无界的
)的XSD模式
这实际上是Xerces(我使用的是2.9.1版)或JAXP中的一个已知问题,如下所述:
我已经知道,如果我将XSD中的maxOccurs数字从大于5000的数字更改为无界的
,所有这些都可以正常工作。不幸的是,在我的情况下,这不是一个选项(我不能干预XSD文件)
我的问题是:
- 有人知道Xerces针对这个问题的其他解决方法吗?或
- 有人能推荐另一个没有这个限制的XML解析器吗
谢谢 我找到了一个不需要更改解析器的解决方案 有一个对maxOccurs设置了5000个限制(以及其他几个限制)
下面是描述限制的文档:我也有同样的问题。我用了这个:
System.setProperty("jdk.xml.maxOccurLimit", "XXXXX");
在console中使用
xjc
命令寻找此问题的解决方案时,我遇到了此线程
对于使用xjc
命令解析xsd的任何人,这对我来说都很有用:
$ xjc -nv foo.xsd
请注意:
默认情况下,XJC绑定编译器在处理源模式之前对其执行严格的验证。使用此选项可禁用严格的架构验证。这并不意味着绑定编译器将不执行任何验证,而是意味着它将执行不太严格的验证
因此,如果您认为您的xsd源代码良好,那么使用不太严格的验证应该不会有问题。如果您将Eclipse IDE与用于JAXB的Dali插件一起使用,您可能会在控制台中获得上述错误 如果在从XSD文件创建JAXB生成选项时,取消选中面板上的“使用严格验证”类生成器选项,则可以避免此类错误。 这样的面板是“Java项目”和“从模式生成类”之后的第三个面板 添加@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);
该错误报告指出实际限制为2147483647。Xerces中加载架构时从解析方法引发的异常清楚地表明:
FATAL:org.xml.sax.saxpasseeption:parser的当前配置不允许将maxOccurs属性值设置为大于值5000。
注意以下文字“当前配置”,不要将“配置”与“实现”混淆“。你是对的,我发现这是一个配置问题。根据属性应该是jdk.xml.maxOccurLimit
,我想这就是答案被否决的原因。你是对的,我更新了它们。”。第二篇链接文章的新版本不再提到5000的限制(我认为只有64000的限制和一些不同的限制),但是四年过去了,可能事情已经改变了;schemaFactory.setFeature(xmlstants.FEATURE\u SECURE\u PROCESSING,Boolean.FALSE)代码>如果我使用以下代码,我会得到一个错误。我能做什么?jaxb:extensionBindingPrefixes)它不允许在受限模式下使用。