当我调用XMLGrammarCachingConfiguration.parseGrammar()时,如何捕获stderr输出?

时间:2012-06-14 23:57:36

标签: java xerces

我在Java中使用Xerces2并拥有XMLGrammarCachingConfiguration。我正在使用它通过调用parseGrammar将XML Schema(xsd)解析为语法池。它可以很好地解析xsd文件,但它会向stderr报告所有错误和警告(我正在使用Eclipse,所以这在控制台中被捕获)。我设法改变了我的xsd,因此它会有一个致命的错误,并且这会引发我的应用程序可以捕获的XNIException,如预期的那样。

我尝试使用XMLGrammarCachingConfiguration.setErrorHandler()方法,并向我传递一个我自己的PrintWriter构造的DefaultErrorHandler。我也试过传递我自己的自定义错误处理程序,它实现了XMLErrorHandler接口。它仍然出现在控制台中,而不是我的PrintWriter正在使用的文件中。

这似乎应该如此简单。有人能告诉我我做错了吗?

- 编辑: 我应该补充说我正在使用自定义XMLEntityResolver,我想要捕获的错误消息是我的解析器无法解析实体的时候,因此从resolveEntity()方法返回null,这意味着默认的实体解析器正试图解决它。即错误消息来自底层默认实体解析器。

1 个答案:

答案 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);

就这么简单。