如何在Java中有效地使用SAXParseException

2022-09-04 04:50:44

我正在验证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”元素的值

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

我认为我可能在“引用到元素”这件事上做错了,也许我应该默认对文档进行标识转换,作为验证的一部分,并使用我可以使用CSS挑选的验证错误属性来增强转换。如果我需要解析消息以使其更友好,这仍然无济于事......

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

干杯


答案 1

我不完全清楚你在这里问什么,也许你可以提供更多关于你所说的例外太低级是什么意思的细节?是错误消息本身不可理解吗?

SaxParseException 类确实具有 getColumnNumber() 和 getLineNumber() 方法,您可以向用户显示这些方法,让他们修复错误。

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

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

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


答案 2

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

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

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

希望这有帮助。


推荐