Лучший способ закрыть поток, который SAX-парсер читает во время анализа? - PullRequest
0 голосов
/ 12 апреля 2009

Давайте прямо к моему вопросу: у меня есть сокет, и все входные данные, поступающие через этот сокет / поток, анализируются моим SAX-парсером. Теперь при определенном событии синтаксического анализа я хотел бы закрыть сокет / поток из моего обработчика событий SAX. Кроме того, я хочу закрыть поток извне в определенном случае, когда синтаксический анализатор все еще работает. К сожалению, я не могу сделать одно или другое без исключения, выдаваемого анализатором (неожиданное завершение документа ...). Хорошо, я могу поймать это исключение, но знаете ли вы решение, как безопасно закрыть поток?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2009

Я не думаю, что вы можете легко это сделать. Вы предоставляете парсеру SAX ресурс (поток) для чтения, а затем закрываете его, и парсер SAX все еще ожидает чтения из него - следовательно, он (не безосновательно!) Выбрасывает «неожиданное завершение документа».

Если вы хотите сделать это чисто, я думаю, что ваш обработчик SAX обработчик , который вы реализовали, должен молча глотать события, как только вы решили игнорировать дальнейшие события.

например. ваши реализации startElement(), endElement() и т. д. должны выполнить проверку, чтобы убедиться, что вы все еще заинтересованы в этих событиях перед обработкой.

Таким образом, синтаксический анализатор SAX может работать без ошибок до конца документа без обработки каких-либо событий.

В качестве альтернативы, почему бы не записать тот факт, что вы закрыли входной поток, а затем, когда вы получите событие «неожиданное завершение документа», посмотрите, действительно ли оно ожидалось . И регистрируйте ошибку, только если она действительно была неожиданной.

0 голосов
/ 14 апреля 2009

Это может быть очевидно, но для такого случая использования лучше подойдет Stax parser . Поскольку приложение контролирует чтение с помощью итерации, оно может закрыть анализатор и базовый поток в любой заданной точке. С SAX вам придется выбросить исключение, которое не особенно элегантно или эффективно. Кроме того, вы можете сделать это только из обработчика.

Для дополнительных очков StaxMate может сделать использование Stax более приятным; без него у Stax такой же низкий уровень абстракции, как у SAX.

Наконец: если ваша проблема заключается в блокировке из-за сокетов, может быть трудно решить традиционные xml-парсеры на основе block-IO. Существует один XML-парсер с открытым исходным кодом, который может выполнять неблокирующий (асинхронный) анализ, но это довольно мало известно, поэтому я оставлю это открытие заинтересованным читателям. : -)

0 голосов
/ 12 апреля 2009

Если вы контролируете завершение создания документа, вы можете настроить сообщение запроса на закрытие, чтобы отправить его обратно на сервер и завершить входящий документ. В зависимости от деталей вашей полной системы, это либо уродливый взлом, либо элегантное решение ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...