2009-04-12 1 views
0

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

ответ

3

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

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

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

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

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

+0

Мне это нравится, если у документа когда-либо есть «конец», поскольку это просто данные, поступающие через сокет. В противном случае просто поймайте исключение. –

0

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

0

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

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

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

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