Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XMLSchema不支持大于5000的maxOccurs的变通方法_Java_Xml Parsing_Xsd_Xerces_Jaxp - Fatal编程技术网

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)它不允许在受限模式下使用。