3

我们遇到了一个问题,即 Java JRE 中的 XML 验证器在 JRE 1.6u24 中变得非常慢,即使在最近的更新中也存在这种情况。

验证 1000 个 XML 需要:

版本 <= 1.6u23 约为 1.4 秒;对于 >= 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);
}
4

1 回答 1

0

我不认为 Woodstox 包含 XSD 验证器。如果你想要一个替代方案,你可以试试 Xerces 的 Apache 版本(通常比 JDK 版本好得多),或者 Saxon-EE。

出现这种减速的最可能原因是您正在从 W3C 网站获取 DTD。我不知道为什么这会在 JDK 版本之间发生变化,但这肯定是在一年前发生的变化,当时 W3C 做出了一项政策决定,通过故意延迟响应来限制对常见 DTD 的请求。如果这是问题,那么解决方案是使用目录将访问重定向到本地副本;或者,如果您使用 Saxon 9.4,它具有内置的最常见 DTD 的副本。

于 2012-08-01T22:22:20.330 回答