确定验证期间XML实例失败的XSD

时间:2012-10-26 16:07:57

标签: java validation xsd

我正在针对多个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.
}

3 个答案:

答案 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.。