针对多个XSD验证XML

时间:2012-09-28 08:41:08

标签: java xml validation xsd

我必须针对架构验证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;
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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