针对大型XSD验证大型XML文件,有一种快速的方法吗?

时间:2017-08-17 07:53:19

标签: java xml kotlin

我试图针对大型XSD快速验证大型XML文档。 XML可以是500到39000行之间的任何地方,XSD可以在2000到3000行之间。

到目前为止,结果是性能非常缓慢,使用如此大的XSD进行解析器的初始化可能需要30秒,但是,这很好,因为我们可以这样做一次然后注入它。

但是,当涉及到实际使用它来验证XML时,根据实现情况,它可能需要30秒到2分钟。

这是一个奇怪的命令行工具,名为xmllint: xmllint --schema test.xsd valid.xml 能够做同样的工作,但立即完成。

我已经尝试了JDOM库,SAXReader方法,并且我已经确定了jdom2的内容,这里是我如何构建它:

URL xsd = Resources.getResource("test-xml/test.xsd");
XMLReaderJDOMFactory factory = new XMLReaderXSDFactory(xsd);
builder = new SAXBuilder(factory);

以下是解析的实施内容:

InputStream stream = new ByteArrayInputStream(inputXml.getBytes());
Document document = builder.build(stream);

builder.build部分是需要立即临时的行。

就所需的解决方案而言,我不介意使用C,Kotlin,只要输出是合理的阅读和快速。

由于

1 个答案:

答案 0 :(得分:0)

所以答案归结为XSD内部的内容,特别是maxOccurs值。在某些时候,maxOccurs都被设置为4999,这导致在此报告错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6483188

如果maxOccurs的实际数量与您无关,则可以将maxOccurs值更改为“unbounded”。或者你可以降低你的maxOccurs值,在我的机器上,maxOccurs值为1000,产生大约1秒的结果来解析值,然后99大约300ms。无限制也在300毫秒。

这显着低于在maxOccurs值为4999时解析所需的50秒