0

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

3 回答 3

0

Xerces J 提供对所有(或可能只是几乎所有?)后模式验证信息集 (PSVI) 的访问,其中包括有关验证元素或属性的类型以及任何无效性质的信息。有关详细信息,请参阅http://xerces.apache.org/xerces2-j/faq-xs.html#faq-8

如果您使用的验证器是 Xerces J,那么您需要的信息是可用的(可能在您正在处理的 SAXParseException 包装的异常中?);如果您正在使用另一个验证器,您可以进一步探索它的 API,也可以使用 Xerces J。

于 2012-10-27T21:38:00.013 回答
0

@Joe,以下链接可能会对您有所帮助。您可以在之前的 Stackoverflow 中找到相同的问题。 针对多个模式定义验证 XML 文件

于 2012-10-26T16:19:45.670 回答
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)
    }
}
于 2012-10-26T16:23:36.973 回答