如何在Java中有效地使用SAXParseException

我正在validationJava中的XMLSchema,并且当我有无效的内容模型时会抛出SAXParseExceptions。

我将使用这些exception来突出validation失败的位置 – 但SAXParseExceptions似乎有点过低。

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

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

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


更新@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? 内存文档比行号和列号更有用!
  • 这是模式validation失败。 为什么我不能得到类似可能类型的失败的枚举和对适当的失败的引用?
  • validation失败的实际模式。
  • 接下来会抛出另一个exception告诉我’en’元素的值导致我需要合并的问题

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

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

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

干杯

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

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

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

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

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

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

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

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

希望这可以帮助。