2012-06-14 2 views
0

Я использую Xerces2 в Java и имею XMLGrammarCachingConfiguration. Я использую его для анализа XML-схемы (xsd) в пул грамматики, вызывая parseGrammar. Он разбирает файл xsd отлично, но он сообщает о всех ошибках и предупреждениях для stderr (я использую Eclipse, чтобы это было зафиксировано в консоли). Мне удалось изменить xsd так, чтобы у него была фатальная ошибка, и это привело к исключению XNIException, которое мое приложение могло бы поймать, как и ожидалось.как я могу захватить вывод stderr, когда я вызываю XMLGrammarCachingConfiguration.parseGrammar()?

Я попытался использовать метод XMLGrammarCachingConfiguration.setErrorHandler() и передал ему DefaultErrorHandler, который я создаю с помощью собственного PrintWriter. Я также попытался передать свой собственный обработчик ошибок, который реализует интерфейс XMLErrorHandler. Тем не менее он отображается в консоли, а не в файле, который использует PrintWriter.

Кажется, что все должно быть так просто. Может ли кто-нибудь сказать мне, что я делаю неправильно?

-edit: Я должен добавить, что я использую пользовательский XMLEntityResolver, и сообщения об ошибках, которые я хочу захватить, - это когда мой резольвер не может разрешить сущность и поэтому возвращает null из ее разрешенияEntity (), что означает, что распознаватель по умолчанию пытается его решить. то есть сообщения об ошибках поступают из основного распознавателя объекта по умолчанию.

ответ

0

ОК, мне удалось это решить. То, что мне нужно было сделать, это создать собственный XMLErrorHandler, и тогда трюк разрабатывал, как зарегистрировать его.

Он должен быть зарегистрирован XMLErrorReporter в XMLGrammarCachingConfiguration, однако, чтобы получить доступ к этому вам нужно позвонить

XMLGrammarCachingConfiguration.getProperty("http://apache.org/xml/properties/internal/error-reporter") 

, а затем бросили объект, который вы получите обратно к XMLErrorReporter и вызвать

XMLErrorReporter.setProperty("http://apache.org/xml/properties/internal/error-handler", customHandler); 

Это было так просто.

Смежные вопросы