3

我必须根据模式验证 XML 文件。问题是该模式由 89 个小 .xsd 文件组成,并使用 xsd:import 构建(文件大小约为 1kb)。当我运行我的验证器方法时,验证需要 30 多秒。有什么方法可以加快这个过程吗?

这是我用于验证的代码:

public boolean checkXML(String XMLFileName, String XSDFileName) {
    Source xmlFile = new StreamSource(new File(XMLFileName));
    Source schemaFile = new StreamSource(new File(XSDFileName));
    SchemaFactory schemaFactory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {
        Schema schema = schemaFactory.newSchema(schemaFile);
        javax.xml.validation.Validator validator = schema.newValidator();
        validator.validate(xmlFile);
        return true;
    } catch (SAXException e) {
        // Validation failed
        return false;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}
4

2 回答 2

2

您应该首先了解哪些类库调用需要时间。即是SchemaFactory.newSchema()吗?Schema.newValidator()? 还是Validator.validate()

我相信你会发现它是前两个之一,而不是第三个。

显而易见的下一步是重构您的代码,以便您只为特定模式文件创建一次模式(和/或验证器),然后缓存它以供每次针对该模式验证 XML 时使用。

于 2012-09-28T09:16:13.913 回答
1

可能需要很长时间的原因有很多。它可能(正如大卫格兰特所建议的那样)与导入和包含的周期有关。或者它可能是一种具有数字出现范围的特别讨厌的内容模型。或者从 W3C 网站获取模式文档(例如 XML 命名空间的模式)可能会出现问题(30 秒的数字在这里敲响了警钟,因为 W3C 网站通常需要很长时间才能响应:他们试图鼓励您使用文档的本地副本)。

试一试撒克逊人,看看效果是否更好。(有时撒克逊人比 Xerces 做得更好,有时做得更糟;知道会很有趣,它可能有助于隔离原因。)

于 2012-09-28T12:02:37.090 回答