【问题标题】:How to use SAXParseException effectively in Java如何在 Java 中有效地使用 SAXParseException
【发布时间】:2009-04-07 14:12:54
【问题描述】:

我正在验证 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})*'

对我来说最重要的是

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

我想做的一个例子是让人们提交一个文档,并在验证失败的地方突出显示该文档并显示一条用户友好的消息 - 上面的错误消息似乎不太友好......不得不用单引号解析就像一场等待发生的事故:)

我想我可能在'reference-to-element'这件事上做错了,也许我应该在默认情况下对文档进行身份转换作为验证的一部分,并使用验证错误来增加转换我可以用 CSS 挑选出的属性。如果我需要解析消息以使它们更友好,那仍然无济于事......

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

干杯

【问题讨论】:

  • +1,我今天早上早些时候遇到了同样的问题。感谢发帖。
  • 没问题,很高兴不只是我笨!
  • 我有一个非常相似的问题。您是否找到了一种解决方案,可以更轻松地使这些错误变得对用户更友好?
  • @Turismo 还没有,有一些想法,如果我成功了会回复。

标签: java validation xsd sax saxparseexception


【解决方案1】:

我不完全清楚你在这里问什么,也许你可以提供更多细节来说明你所说的异常太低级是什么意思?是不是报错信息本身看不懂?

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

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

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

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

【讨论】:

    【解决方案2】:

    Brabster 我也遇到了类似的问题,我需要告诉 xml 中的哪个元素出现错误。我通过在我的 SAX Parser 处理程序中维护一个堆栈来稍微解决了这个问题。在 startElement 方法中,我将 qName(元素的名称)压入堆栈,在 endElement 方法中,我从堆栈中弹出 qName。

    每当出现异常时,我的堆栈都会代表元素的完整 XPath。

    唯一的问题是,如果有多个同名元素,那么您不知道错误是针对哪个元素的。但至少完整的 XPath 详细信息与 LineNumber 和 ColumnNumber 一起提供了帮助。

    希望这会有所帮助。

    【讨论】:

      最近更新 更多