我们遇到了一个问题,即Java JRE中的XML验证器在JRE 1.6u24中变得非常慢,即使在最近的更新中也存在这种情况。
为我们验证1000个XML:
~1.4秒版本< = 1.6u23; 对于版本> = 1.6u24
,约为15.2秒慢10倍!我试图搜索是否有人发现了这个问题,但我找不到任何东西。
我们当然可以通过使用像woodstox这样的另一个库来解决它,但是我们更喜欢纯粹的JRE,我不相信这可能会存在很长时间没有任何改进......
我们测试的代码如下所示:
public static void main(String[] args) throws XMLStreamException, SAXException, IOException, ParserConfigurationException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new Source[] {
new StreamSource(new File("schema1.xsd")),
new StreamSource(new File("schema2.xsd")) });
Validator validator = schema.newValidator();
XMLInputFactory staxFactory = XMLInputFactory.newInstance();
String xml = FileUtils.readFileToString(new File("to_validate.xml"), "UTF-8");
Date start = new Date();
for (int i = 0; i < 1000; i++) {
XMLStreamReader xmlr = staxFactory.createXMLStreamReader(new StringReader(xml));
StAXSource ss = new StAXSource(xmlr);
validator.validate(ss);
}
Date end = new Date();
System.out.println("seconds needed: " + (end.getTime() - start.getTime()) / 1000f);
}
答案 0 :(得分:0)
我认为Woodstox不包含XSD验证器;如果你想要一个替代方案,你可以尝试Apache版本的Xerces(通常比JDK版本好得多)或Saxon-EE。
这样的减速最可能的原因是你从W3C网站上获取DTD。我不知道为什么这会在JDK版本之间发生变化,但肯定会在一年前发生变化,当时W3C通过故意延迟响应来采取政策决定来限制对常见DTD的请求。如果这是问题,那么解决方案是使用目录来重定向对本地副本的访问;或者如果您使用Saxon 9.4,它会包含内置最常见DTD的副本。