Java 针对大型XSD验证大型XML文件,有没有快速的方法?

Java 针对大型XSD验证大型XML文件,有没有快速的方法?,java,xml,kotlin,Java,Xml,Kotlin,我试图根据大型XSD快速验证大型XML文档。XML的长度可以在500到39000行之间,XSD的长度在2000到3000行之间 到目前为止,结果是性能非常慢,使用如此大的XSD初始化解析器可能需要30秒,但是,这很好,因为我们可以这样做一次,然后注入它 但是,实际使用它来验证XML时,根据实现的不同,可能需要30秒到2分钟 作为一个名为xmllint的命令行工具,这确实很奇怪: xmllint--schema test.xsd valid.xml 能够完成相同的工作,但立即完成 我已经尝试过JD

我试图根据大型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,这会导致此处报告的错误:

如果maxOccurs的实际数量与您无关,则可以将maxOccurs值更改为“unbounded”。或者你可以降低你的maxOccurs值,在我的机器上,maxOccurs值1000会产生一个大约1秒的结果来解析这些值,然后在大约300ms时达到99。无界速度也为300ms


这明显低于解析maxOccurs值为4999时所需的50秒,因此答案归结为XSD中的实际内容,特别是maxOccurs值。在某些情况下,maxOccurs都设置为4999,这会导致此处报告的错误:

如果maxOccurs的实际数量与您无关,则可以将maxOccurs值更改为“unbounded”。或者你可以降低你的maxOccurs值,在我的机器上,maxOccurs值1000会产生一个大约1秒的结果来解析这些值,然后在大约300ms时达到99。无界速度也为300ms


这比解析maxOccurs值为4999时所需的50秒要低得多,当然不会花那么长时间,我怀疑在验证过程中,您正在从web获取资源:可能是W3C网站上的XML名称空间模式等资源。W3C故意放慢此类请求的速度以阻止它们。找出您正在获取的资源(例如,通过网络监控)并用本地副本替换它们。顺便说一下,我不会将您的XML文件或XSD文件描述为“大”。大小对我来说似乎非常适中。嘿,所以我们找到了原因,我现在只是给出答案。肯定不会花那么长时间,我的怀疑是,在验证过程中,您正在从web获取资源:可能是资源,例如W3C网站上的XML名称空间模式。W3C故意放慢此类请求的速度以阻止它们。找出您正在获取的资源(例如,通过网络监控)并用本地副本替换它们。顺便说一下,我不会将您的XML文件或XSD文件描述为“大”。对我来说,大小似乎非常适中。嘿,我们找到了原因,我现在正在给出答案。是的,minOccurs和maxOccurs的大有限值会导致基于FSA的经典算法出现问题。Saxon模式验证器通常会处理它:但不是在病理情况下,如
(x发生{10002000})发生{40,50}
。是的,minOccurs和maxOccurs的大有限值会导致经典的基于FSA的算法出现问题。Saxon模式验证器通常会处理它:但不是在病理情况下,如
(x发生{10002000})发生{40,50}