如何在Java中有效地使用SAXParseException

bra*_*ter 14 java validation xsd sax saxparseexception

我正在验证Java中的XMLSchema,并且当我有无效的内容模型时会抛出SAXParseExceptions.

我将使用这些异常来突出验证失败的位置 - 但SAXParseExceptions似乎有点过低.

例如,对于枚举失败,我得到的有效性错误是所提供的值与一个例外中的内容模型不匹配,以及它在下一个例子中应用的元素.

我想我需要一个实用程序抽象一点将相关的错误合并在一起,并将异常文本解析为可用的异常属性.

这是一种合理的方法,还是我只是缺少某些东西,或者是图书馆或助手班?


更新@timgilbert,感谢您的回复.

例如,我在t'internet上找到了一个SAXParseException

cvc-pattern-valid: Value 'en' is not facet-valid
with respect to pattern '([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*'
Run Code Online (Sandbox Code Playgroud)

对我来说关键的事情是

  • 此例外适用的元素'en'.为什么我不能调用exception.getElement()或者其他东西,为什么不对有问题的元素进行XPath?内存文档比行号和列号更有用!
  • 这是模式验证失败.为什么我不能得到类似可能类型的失败的枚举和对适当的失败的引用?
  • 验证失败的实际模式.
  • 接下来会抛出另一个异常告诉我'en'元素的值导致我需要合并的问题

我希望能够做的一个例子就是让人们提交一份文件,并通过用户友好的消息突出显示验证失败的文件 - 上面的错误消息似乎不太友好......必须解析单引号就像是一场等待发生的事故:)

我想我可能做错了"引用元素"的事情,也许我应该默认将文档的身份转换作为验证的一部分,并使用验证错误属性来扩充转换可以用CSS挑选出来.如果我需要解析消息以使它们更友好,那仍然无济于事......

Re:紧密绑定,javax.xml.validation.Validator.validate()抛出org.xml.sax.SAXException无论如何 - 不知道如何摆脱假设绑定...

干杯

Tim*_*ert 1

我不完全清楚你在这里问的是什么,也许你可以提供更多关于异常太低级别的含义的细节?是不是错误信息本身就难以理解?

SaxParseException 类确实具有 getColumnNumber() 和 getLineNumber() 方法,您可以将它们提供给用户以让他们修复错误。

您可能会尝试的一件事是使用不同的 XML 解析实现 - 每个解析器在发现无效代码时都会抛出错误,但不同的实现可能有不同的错误消息和异常链。

实际上,出于这个原因,我对尝试构建一个检查异常链并尝试从中构建更连贯的错误消息的库持怀疑态度,因为您会将代码与异常的具体细节紧密耦合。 XML 解析实现(特别是如果您依赖于错误消息的特定措辞)。

(抱歉,这不是更具体,也许你可以举一个你所看到的问题的例子?)