根据大型XSD验证大型XML文件,有没有一个快速的方法来做到这一点?

我试图快速验证大的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,只要输出是合理的阅读和快速的。

谢谢

所以答案归结到XSD中的内容,特别是maxOccurs值。 在某些时候,maxOccurs全部设置为4999,这导致了一个bug报告在这里: http : //bugs.java.com/bugdatabase/view_bug.do?bug_id=6483188

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

这大大低于解析maxOccurs值为4999的50秒