繁体   English   中英

如何在Java中有效地使用SAXParseException

[英]How to use SAXParseException effectively in Java

我正在验证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挑选出来。 如果我需要解析消息以使它们更友好,那仍然无济于事......

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

干杯

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

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

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

希望这可以帮助。

我不完全清楚你在这里问的是什么,也许你可以提供一些更详细的信息,说明你的意思是什么意思太低了? 是错误信息本身是不可理解的?

SaxParseException类具有getColumnNumber()和getLineNumber()方法,您可以将这些方法呈现给用户以使其能够修复错误。

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

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

(对不起,这不是更具体,也许您可​​以举例说明您遇到的问题?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM