我必须针对架构验证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;
}
答案 0 :(得分:2)
您应该首先了解哪些类库调用需要时间。即是SchemaFactory.newSchema()
吗? Schema.newValidator()
?还是Validator.validate()
?
我相信你会发现它是前两个之一,而不是第三个。
显而易见的下一步是重构代码,以便您只为特定模式文件创建一次Schema(和/或Validator),然后在每次根据该模式验证XML时对其进行缓存以供使用。
答案 1 :(得分:1)
可能需要很长时间的原因有很多。它可能(正如大卫格兰特建议的那样)与进口周期有关,包括。或者它可能是一个特别讨厌的内容模型,具有数字出现范围。或者从W3C网站获取XML命名空间的模式(例如30秒响铃,这可能是一个问题)因为W3C网站通常需要很长时间才能响应:他们正在努力鼓励您使用文档的本地副本。)
尝试撒克逊,看看是否有更好的效果。 (有时撒克逊比Xerces更好,有时候它会变得更糟;知道它会很有趣,它可能有助于隔离原因。)