我一直在尝试让 SimpleXML 读取巨大的 XML,但遇到了属性大小限制。
javax.xml.stream.XMLStreamException:超出最大属性大小限制 (524288) 在 com.ctc.wstx.sr.StreamScanner.constructLimitViolation(StreamScanner.java:2470)
我尝试过使用系统属性,但似乎没有找到它。
-Djavax.xml.stream.XMLInputFactory=com.ctc.wstx.stax.WstxInputFactory -Dcom.ctc.wstx.maxAttributeSize=10000000
如何强制 Woodstox 使用新的限制?
我找到了一种有效的方法。我创建了自己的 XMLInputFactory,它扩展了 woodstox 工厂,从而改变了有问题的限制。
public class InputFactory extends WstxInputFactory {
public InputFactory() {
super();
setProperty(WstxInputProperties.P_MAX_ATTRIBUTE_SIZE, Integer.MAX_VALUE);
}
}
然后在main中设置系统属性即可。
// Force use of our custom XML input factory
System.getProperties().put("javax.xml.stream.XMLInputFactory", "my.custom.InputFactory");
这个简单的代码也可以工作:
XMLInputFactory factory = XMLInputFactory.newFactory();
factory.setProperty(WstxInputProperties.P_MAX_ATTRIBUTE_SIZE, Integer.MAX_VALUE);
我遇到这个问题是因为我对 axis2 也有同样的问题,它使用 XML 解析中的 axiom,而 axiom 使用 woodstox 进行 Stax。
我想可以通过将以下文件上传到我的 tomcat 安装来修复它 ${CATALINA_HOME}/webapps/axis2/WEB-INF/classes/XMLInputFactory.properties 内容如下
com.ctc.wstx.maxAttributeSize= 2147483647
我已经根据关于如何覆盖默认 woodstox 属性的 axiom DOC 完成了此操作 https://ws.apache.org/axiom/userguide/ch04.html#factory.properties
希望有用