【问题标题】:javax.xml.stream.XMLStreamException: Maximum Element Depth limit (1000) Exceededjavax.xml.stream.XMLStreamException: 超过最大元素深度限制 (1000)
【发布时间】: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


【解决方案1】:

不,不要关注ReaderConfig(或WriterConfig)。 那是内部类:所有配置都应该通过XMLInputFactory和XMLOutputFactory中的标准setProperty()方法。

要使用的键在另一个类中定义;工厂级标准Stax;同行中的 Stax2 扩展(我认为XMLInputFactory2/XMLOutputFactory2,或者,可能是XMLStreamReader2 / XMLStreamWriter2);和 Woodstox 在WstxInputProperties 和WstxOutputProperties 的自有物业。

【讨论】:

  • 我用过-Dcom.ctc.wstx.maxEntityDepth,但是没用。
  • @AlexPriadko 会设置“系统属性”,而 Stax 不使用这些属性进行配置(尽管允许它用于连接输入/输出工厂)。您需要通过 XMLInputFactory / XMLOutputFactory 实例以编程方式显式设置值。
  • 嗨@staxman,我已经为该主题添加了一些更新,您能看一下吗?
【解决方案2】:

为您的ReaderConfig 实例调用此方法:

public void setMaxElementDepth(int value) {
    mMaxElementDepth = value;
}

【讨论】:

  • 是的,我是在调试模式下完成的,但我想通过属性或更合适的方式进行配置。
  • 所以通过读取属性并在代码中调用该方法来配置它。
  • FWIW,似乎没有任何标准支持从配置文件配置 STAX 解析器。
  • Stax API 不支持,不。但是在XMLInputFactory 上调用setProperty() 的官方机制是以某种可移植的方式进行的(可惜没有标准机制来检测impls 支持哪些属性)。
猜你喜欢
  • 1970-01-01
  • 2021-01-18
  • 2012-06-09
  • 2022-10-02
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多