【发布时间】:2017-12-26 09:40:01
【问题描述】:
有谁知道我如何为 ReaderConfig.class 配置最大元素深度,默认情况下它使用此值https://github.com/FasterXML/woodstox/blob/master/src/main/java/com/ctc/wstx/api/ReaderConfig.java#L44,但我无论如何也无法更改它。
因为我有异常 javax.xml.stream.XMLStreamException: Maximum Element Depth limit (1000) 当我尝试解析一些大的 XML 文档时超出。
更新: 我对它进行了更深入的调查,以及我所看到的
FileInputStream input = new FileInputStream(new File("...../some.xml"));
InputStreamReader inputStreamReader = new InputStreamReader(input);
XStream xstream = new XStream(new StaxDriver());
xstream.fromXML(inputStreamReader);
在 StaxDriver.java 我们有字段 XMLInputFactory inputFactory;通过 XMLInputFactory.newInstance() 初始化了 StaxDriver.java#150,我无法为 XMLInputFactory 传递任何参数。
注意: 当我们使用 com.ctc.wstx.stax.WstxInputFactory 时会发生此异常。
我通过属性 javax.xml.stream.XMLInputFactory=com.sun.xml.internal.stream.XMLInputFactoryImpl 修复了这个问题
但对于 WstxInputFactory,我没有看到任何解决方案。
【问题讨论】:
-
我想通过属性或更合适的方式来配置它。
-
你确定文档合法地有这么深的嵌套吗?设置当然可以更改,但这似乎有点极端……例如,每个嵌套级别都会使用一些额外的资源,这可能会导致数万或数十万的问题。
-
没关系,也许看起来很奇怪,但我们实际上有这么深的嵌套。活着是一种痛苦。
-
好的。只是想我会提到它,有时开发人员最终会解决一个症状,然后发现还有另一个根本原因。但我希望嵌套仍然是有限的。无论哪种方式,绝对可以更改设置,例如
Integer.MAX_VALUE,以有效禁用它。 -
另外,fwtw,这些限制是为了保护拒绝服务攻击而添加的:这个特定设置不太可能被使用,但其他一些设置(如实体的嵌套级别)已报告为实际存在的攻击。这只是作为背景。也许应该放宽默认设置...我想知道实际嵌套报告的最高值是多少:例如,将其设置为 10,000 可能不会对 DoS 保护产生太大影响。
标签: java xml parsing exception