Как игнорировать ошибки XML при разборе ошибочного XML с Sax (на Android)

Вопрос о синтаксическом анализаторе Sax XML на Android, используя Java: мне нужно разобрать XML-файлы, которые я получаю из Интернета, и что я не контролирую их. Некоторые из них содержат ошибки и приводят к тому, что синтаксический анализатор прерывается с ошибками, такими как «несогласованный тег» или «неправильно сформированный (недопустимый токен)».

Эти ошибки не имеют значения для меня, я хочу игнорировать их и продолжать идти, я могу обрабатывать разбитую структуру XML. Но я не могу исправить файлы XML, они не мои. Как я могу сказать Sax на Android (класс org.xml.sax.XMLReader), чтобы не генерировать исключение и продолжать? Прикрепление ErrorHandler не помогло, и перехват исключения бесполезен, потому что я не могу возобновить разбор, где он остановился.

Мой XML не HTML, но вот некоторые (X) HTML-примеры, в которых браузеры игнорируют ошибки и продолжают двигаться. Я тоже хочу это сделать.

  • Браузеры в порядке с « <br> » вместо « <br/> », даже если тег никогда не закрывается.
  • « <B> <i> текст </ b> </ i> " работает, даже если закрывающие теги находятся в неправильном порядке.
  • « Odds & ends » принимается, несмотря на недействительный токен, « odds & amp; end » будет правильным.

Я бы предпочел не писать собственный парсер, имея дело с наборами символов и всем этим. Мне не нужно проверять XML. Вот мой код, сведенный к основному:

XMLReader r = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); r.setErrorHandler(new MyLenientErrorHandlerThatNeverThrows()); r.setContentHandler(new MyImporterThatExtendsDefaultHandler()); r.parse(new InputSource(new BufferedReader(...))); 

Благодаря!

Хорошо, похоже, это невозможно. Sax поддерживает обнаружение ошибок, но не восстановление ошибок, что делает его менее идеальным для надежного кода в этом примере. Получил его на работу, заменив Sax на XmlPullParser, который позволяет обернуть следующий токен в блоке try-catch:

 try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(in); int type = xpp.getEventType(); while (type != XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_TAG: startTag(xpp); break; case XmlPullParser.END_TAG: endTag(xpp); break; case XmlPullParser.TEXT: characters(xpp.getText()); break; } try {type = xpp.next();} catch (XmlPullParserException e) {} } } catch (Exception e) {} 
Intereting Posts
Какова базовая линия в RelativeLayout? NullPointerException: name == null Linux Ubuntu Android SDK менеджер не запускается – андроид: java: не найден Критерий. Интеграция с андроидом действительно так просто? Использует ли android dalvik vm оптимизацию анализа побега? Запустите Androids WiFi-Manager, отправив намерение? RxAndroid: изменения пользовательского интерфейса в потоке Schedulers.io () Не может получить доступ к XmlRpcController, XmlRpcHttpRequestConfig Экспорт APK из eclipse (ADT) бесшумно падает Android – Правильный способ использования AsyncTasks? Как лучше всего реализовать две действия, разделяющие одну услугу (соединение Bluetooth)? Выясните идентификатор запущенного процесса по имени пакета Определение функции RecyclerView onCLickListener в действии Android – вам когда-либо приходилось добавлять фрагменты в манифест Пикассо загружается в неправильное изображение при использовании шаблона держателя изображения