我正在针对多个XSD架构验证xml实例。如果验证失败,我想确定xml实例失败的哪个模式。 SAXParseException
没有足够的信息来确定这一点。
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Source[] sources = getXsdSources();
Schema schema = factory.newSchema(sources);
Validator validator = schema.newValidator();
try {
validator.validate(input);
} catch (SAXParseException e) {
// Error handling.
}
答案 0 :(得分:0)
@Joe,以下链接可能对您有所帮助。您可以在之前的Stackoverflow中找到相同的问题。 Validate an XML File Against Multiple Schema Definitions
答案 1 :(得分:0)
您需要单独验证每个架构,而不是将它们全部加载到“架构”中。那么一个简单的问题是迭代“源”设置'验证器'列表到每一个,所以你可以跟踪失败时加载的是什么。
这未经过测试,但应该是正确的:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Source[] sources = getXsdSources();
foreach( Source s : sources){
Schema schema = factory.newSchema(s);
Validator validator = schema.newValidator();
try {
validator.validate(input);
} catch (SAXParseException e) {
// Error handling.
System.out.println("failed on " + s.getSystemID)
}
}
答案 2 :(得分:0)
Xerces J提供对架构后验证信息集(PSVI)的所有(或者可能只有几乎 all?)的访问权限,其中包括有关验证元素或属性的类型的信息,以及任何无效的性质。有关详细信息,请参阅http://xerces.apache.org/xerces2-j/faq-xs.html#faq-8。
如果您使用的验证器是Xerces J,那么您需要的信息是可用的(可能在您正在处理的SAXParseException包装的异常中?);如果你正在使用另一个验证器,你可以更多地探索它的API,或者你可以使用Xerces J.。