2
  public static boolean IsValid(InputStream xml, InputStream xsd)
  {
    try
    {
      SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
      Schema schema = factory.newSchema(new StreamSource(xsd));
      Validator validator = schema.newValidator();
      validator.validate(new StreamSource(xml));
      return true;
    }
    catch (Exception ex)
    {
      return false;
    }
  }

如您所见,异常用于控制流,我想更改它,因为这不是好的做法,因为异常应该仅用于异常情况。(也许有人会争辩说,如果 xml 无效,在某些情况下这确实是一种例外情况......)

validate方法有另一个签名validate(Source source, Result result),但看看Result界面并没有真正帮助我。

/**
 * Set the system identifier for this Result.
 *
 * <p>If the Result is not to be written to a file, the system identifier is optional.
 * The application may still want to provide one, however, for use in error messages
 * and warnings, or to resolve relative output identifiers.</p>
 *
 * @param systemId The system identifier as a URI string.
 */
public void setSystemId(String systemId);

/**
 * Get the system identifier that was set with setSystemId.
 *
 * @return The system identifier that was set with setSystemId,
 * or null if setSystemId was not called.
 */
public String getSystemId();

那么如何根据 Schema 验证 XML?它不需要是我的方法!是否打算使用validate我的方式?

4

2 回答 2

2

我认为您应该实现一个ErrorHandler,例如通过扩展,并通过调用DefaultHandler将其注册到您的.ValidatorValidator#setErrorHandler()

ErrorHandler可以记录所有验证错误(和警告,如果您对它们感兴趣)。不要忘记实现/覆盖该fatalError(...)方法,以便在无法解析文档时通知您,例如因为它的格式不正确。

只要您ErrorHandler不抛出任何异常,对validate(). 它的 Javadoc 声明它将抛出一个SAXException

如果ErrorHandler抛出一个SAXException或者如果发现一个致命错误并且ErrorHandler正常返回。

因此,应该可以验证文档而不依赖于控制流的异常处理。只要您ErrorHandler在验证文件后询问您是否发现任何错误。不幸的是,如果您的文档格式不正确,您仍然需要捕获SAXParseException.

于 2013-07-22T10:59:51.767 回答
2

JAXP 验证接口的设计者选择使用异常来表示验证失败。您可能认为这是一个糟糕的设计,但您的选择是按照设计的方式使用该 API,或者寻找不同的 API。

于 2013-07-22T13:07:12.797 回答