Java 如何根据模式验证XML,而不对控制流使用异常?

Java 如何根据模式验证XML,而不对控制流使用异常?,java,xml,validation,exception,xsd,Java,Xml,Validation,Exception,Xsd,正如您所看到的,异常用于控制流,我想对其进行更改,因为这不是一个好的实践,因为异常应该只用于异常情况。 也许有人会争辩说,在某些上下文中,如果xml无效,这确实是一种例外情况 validate方法有一个签名validateSource、Result和Result,但是查看结果接口并没有真正帮助我 public static boolean IsValid(InputStream xml, InputStream xsd) { try { SchemaFacto

正如您所看到的,异常用于控制流,我想对其进行更改,因为这不是一个好的实践,因为异常应该只用于异常情况。 也许有人会争辩说,在某些上下文中,如果xml无效,这确实是一种例外情况

validate方法有一个签名validateSource、Result和Result,但是查看结果接口并没有真正帮助我

  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呢?这不需要是我的方法!它是否打算使用我的验证方法?

我认为您应该实现,例如通过扩展,并通过调用将其注册到您的验证程序

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

只要ErrorHandler不抛出任何异常,验证调用也不会抛出任何异常。它的Javadoc声明它将抛出一个SAXException

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


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

我认为您应该实现,例如通过扩展,并通过调用将其注册到验证器

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

只要ErrorHandler不抛出任何异常,验证调用也不会抛出任何异常。它的Javadoc声明它将抛出一个SAXException

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


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

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

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

但这不会改变异常用于控制流的事实。所以我基本上可以让它保持原样,这样会更容易。@mike异常意味着允许程序采取另一种操作方式,或者通知用户,或者关闭,或者诸如此类。使用ErrorHandler并仅捕获与流验证错误相对应的SAXException。此外,验证是转换过程中的一个步骤,它不应该放在一个单独的方法中。嗯,也许我对验证太严格了。我把验证方法放在一个util类中,因为我有一些xml文件,我想在程序开始时检查/反序列化。我没有说我喜欢javax.xml包当前采用的方法。我更喜欢在特殊情况下使用异常,而格式不好的文档是我希望能够处理的,没有异常。谢谢您的努力。我将考虑扩展错误处理程序,或者坚持我当前的方法,因为它满足了我的需要。但是这不会改变异常用于控制流的事实。所以我基本上可以让它保持原样,这样会更容易。@mike异常意味着允许程序采取另一种操作方式,或者通知用户,或者关闭,或者诸如此类。使用ErrorHandler并仅捕获与流验证错误相对应的SAXException。此外,验证是转换过程中的一个步骤,它不应该放在一个单独的方法中。嗯,也许我对验证太严格了。我把验证方法放在一个util类中,因为我有一些xml文件,我想在程序开始时检查/反序列化。我没有说我喜欢javax.xml包当前采用的方法。我更喜欢在特殊情况下使用异常,而格式不好的文档是我希望能够处理的,没有异常。谢谢您的努力。我将考虑扩展错误句柄。
呃,或者坚持我目前的方法,因为它足以满足我的需要。我在想他们为什么要这样设计。我想不出任何其他方式来表明失败,并说明失败发生的地方。一个布尔标志是不够的。我在想为什么他们会这样设计。我想不出任何其他方式来表明失败,并说明失败发生的地方。一个布尔标志是不够的。
/**
 * 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();