我试图针对大型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,只要输出是合理的阅读和快速。
由于
答案 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秒