我在Java中使用Xerces2并拥有XMLGrammarCachingConfiguration。我正在使用它通过调用parseGrammar将XML Schema(xsd)解析为语法池。它可以很好地解析xsd文件,但它会向stderr报告所有错误和警告(我正在使用Eclipse,所以这在控制台中被捕获)。我设法改变了我的xsd,因此它会有一个致命的错误,并且这会引发我的应用程序可以捕获的XNIException,如预期的那样。
我尝试使用XMLGrammarCachingConfiguration.setErrorHandler()方法,并向我传递一个我自己的PrintWriter构造的DefaultErrorHandler。我也试过传递我自己的自定义错误处理程序,它实现了XMLErrorHandler接口。它仍然出现在控制台中,而不是我的PrintWriter正在使用的文件中。
这似乎应该如此简单。有人能告诉我我做错了吗?
- 编辑: 我应该补充说我正在使用自定义XMLEntityResolver,我想要捕获的错误消息是我的解析器无法解析实体的时候,因此从resolveEntity()方法返回null,这意味着默认的实体解析器正试图解决它。即错误消息来自底层默认实体解析器。
答案 0 :(得分:0)
好的,我设法解决了这个问题。我需要做的是创建我自己的XMLErrorHandler,然后诀窍就是如何注册它。
需要在XMLGrammarCachingConfiguration的XMLErrorReporter中注册,但要访问您需要调用的
XMLGrammarCachingConfiguration.getProperty("http://apache.org/xml/properties/internal/error-reporter")
然后将您返回的对象强制转换为XMLErrorReporter并调用
XMLErrorReporter.setProperty("http://apache.org/xml/properties/internal/error-handler", customHandler);
就这么简单。