Вопрос о синтаксическом анализаторе Sax XML на Android, используя Java: мне нужно разобрать XML-файлы, которые я получаю из Интернета, и что я не контролирую их. Некоторые из них содержат ошибки и приводят к тому, что синтаксический анализатор прерывается с ошибками, такими как «несогласованный тег» или «неправильно сформированный (недопустимый токен)».
Эти ошибки не имеют значения для меня, я хочу игнорировать их и продолжать идти, я могу обрабатывать разбитую структуру XML. Но я не могу исправить файлы XML, они не мои. Как я могу сказать Sax на Android (класс org.xml.sax.XMLReader), чтобы не генерировать исключение и продолжать? Прикрепление ErrorHandler не помогло, и перехват исключения бесполезен, потому что я не могу возобновить разбор, где он остановился.
Мой XML не HTML, но вот некоторые (X) HTML-примеры, в которых браузеры игнорируют ошибки и продолжают двигаться. Я тоже хочу это сделать.
Я бы предпочел не писать собственный парсер, имея дело с наборами символов и всем этим. Мне не нужно проверять 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) {}