Пойдем прямо к моему вопросу: у меня есть сокет, и все входные данные, поступающие через этот сокет/поток, анализируются моим парсером SAX. Теперь, после определенного события синтаксического анализа, я хотел бы закрыть сокет/поток из моего обработчика событий SAX. Кроме того, я хочу закрыть поток извне в определенном случае, пока парсер все еще работает. К сожалению, я не могу сделать одно или другое, не имея исключения, созданного синтаксическим анализатором (неожиданное завершение документа ...). Хорошо, я мог поймать это исключение, но знаете ли вы решение, как безопасно закрыть поток?Лучший способ закрыть поток анализатором SAX во время процесса синтаксического анализа?
ответ
Я не думаю, что вы можете легко это сделать. Вы даете синтаксическому анализатору SAX ресурс (поток) для чтения, а затем вы закрываете его, и синтаксический анализатор SAX по-прежнему ожидает от него чтения - следовательно, он (не необоснованно!) Бросает «неожиданный конец документа».
Если вы хотите сделать это чисто, я думаю, что ваш анализатор SAX handler, который вы внедрили, должен молча проглатывать события, как только вы решили игнорировать дальнейшие события.
например. ваши реализации startElement()
, endElement()
и т. д. должны выполнить проверку, чтобы убедиться, что вы все еще интересуетесь этими событиями перед обработкой.
Таким образом, синтаксический анализатор SAX может работать до конца документа без обработки каких-либо событий.
В качестве альтернативы, почему бы не записать тот факт, что вы закрыли входной поток, а затем, когда вы получили событие «неожиданное завершение документа», посмотрите, действительно ли это было. И регистрируйте ошибку только в том случае, если это действительно было неожиданным.
Если вы управляете концом создания документа, вы можете настроить сообщение с запросом на закрытие для отправки обратно на сервер и завершения входящего документа. В зависимости от деталей вашей полной системы это либо уродливый хак, либо изящное решение ... :)
Это может быть очевидно, но для использования в таком случае Stax parser может быть лучше. Поскольку управление приложениями с помощью итерации позволяет закрыть синтаксический анализатор и базовый поток в любой заданной точке. С SAX вам придется выбросить исключение, которое не особенно элегантно или эффективно. Кроме того, вы можете сделать это только из обработчика.
За дополнительные баллы StaxMate может использовать Stax более приятным; без него Stax имеет аналогичный низкий уровень абстракции как SAX.
И наконец: если ваша проблема связана с блокировкой из-за сокетов, ее может быть сложно решить с помощью традиционных синтаксических анализаторов на основе xing-IO. Существует один XML-анализатор с открытым исходным кодом, который может выполнять неблокирующий (асинхронный) синтаксический анализ, но это мало известно, поэтому я оставлю это открытие заинтересованным читателям. :-)
- 1. Проверка синтаксического анализа Java SAX
- 2. SAX синтаксического анализа в андроиде
- 3. SAX синтаксического анализа - эффективный способ получить текстовые узлы
- 4. XPATH лучший способ для синтаксического анализа XML
- 5. Проблемы с производительностью во время синтаксического анализа
- 6. Лучший метод для синтаксического анализа текста androidK
- 7. шаблоны синтаксического анализа во время компиляции
- 8. Looping результат во время синтаксического анализа списка
- 9. Java/джексон - разрешить во время синтаксического анализа
- 10. отлов ошибок во время строки синтаксического анализа
- 11. Reference лексема значение во время синтаксического анализа
- 12. исключение синтаксического анализа android Sax для символа «» »
- 13. Android синтаксического анализа XML с помощью SAX
- 14. Java SAX синтаксического анализа XML-файл
- 15. RSS с синтаксическим анализатором SAX
- 16. поток синтаксического анализа, разделение строки
- 17. выпуск с синтаксическим анализатором SAX в java
- 18. Анализ синтаксического анализа синтаксического анализа SAX (javax.xml.parsers.SAXParser) на Android API 1.5
- 19. Лучший способ зарегистрировать время начала процесса?
- 20. Лучший способ для анализа
- 21. Karma runner выходит на ошибку синтаксического анализа во время TDD
- 22. Nokogiri зачистка атрибутов пространств имен во время синтаксического анализа
- 23. Хроническое неправильное время синтаксического анализа
- 24. Лучший способ синтаксического анализа большого, вложенного XML-листа с PHP?
- 25. Лучший способ для синтаксического анализа XML в java
- 26. Каков эффективный способ синтаксического анализа строки во встроенной системе?
- 27. блок повышения синтаксического анализа строковый поток
- 28. RSS поток синтаксического анализа после того, как:
- 29. Mule XML файла входной поток синтаксического анализа
- 30. воткнуть `*` до ближайшего следующего слова во время синтаксического анализа
Мне это нравится, если у документа когда-либо есть «конец», поскольку это просто данные, поступающие через сокет. В противном случае просто поймайте исключение. –