Cómo ignorar errores XML al analizar XML defectuoso con Sax (en Android)

Pregunta sobre el analizador XML de Sax en Android, usando Java: Necesito analizar archivos XML que obtengo de la web, y que no tengo control sobre. Algunos contienen errores y hacen que el analizador de anular con errores como "tag no coincidentes" o "no bien formado (token no válido)".

Esos errores no me importan, quiero ignorarlos y seguir adelante, puedo manejar la estructura XML rota. Pero no puedo arreglar los archivos XML, ellos no son míos. ¿Cómo puedo decir Sax en Android (clase org.xml.sax.XMLReader) para no lanzar una excepción y seguir adelante? La conexión de un ErrorHandler no funcionó, y la captura de la excepción es de ninguna utilidad porque no puedo reanudar el análisis en el que se detuvo.

Mi XML no es HTML, pero aquí hay algunos ejemplos (X) HTML en los que los navegadores ignoran los errores y continúan. Quiero hacer esto también.

  • Los navegadores están bien con " <br> " en lugar de " <br/> " aunque la etiqueta nunca esté cerrada.
  • " <B> <i> texto </ b> </ i> " funciona aunque las etiquetas de cierre estén en el orden incorrecto.
  • " Odds & ends " se acepta a pesar del token no válido, " odds & amp; ends " sería correcto.

Preferiría no escribir mi propio analizador, tratando con conversiones de conjunto de caracteres y todo eso. No necesito validar XML. Aquí está mi código, reducido a lo esencial:

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

¡Gracias!

Ok, parece que no se puede hacer. Sax soporta la detección de errores pero no la recuperación de errores, lo que hace que sea menos ideal para código robusto en este ejemplo. Lo consiguió para trabajar por replaxing Sax con XmlPullParser, que permite envolver la llamada siguiente token en un bloque 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) {} 
  • Parser SAX vs analizador XMLPull
  • Android: El mejor analizador para analizar datos XML
  • Android: ¿por qué utilizar XMLReader?
  • Sax - ExpatParser $ ParseException
  • Cómo analizar el contenido html en android utilizando SAX PARSER
  • Con SAX Parser, obtiene el valor de un atributo
  • Obtener longitud desconocidaHttpInputStream al obtener InputStream de HttpURLConnection en android
  • Diferencia entre el analizador XML SAX, analizador de tracción y analizador de DOM en android
  • Android analiza un xml con saxparser
  • Análisis de archivos XML grandes utilizando el analizador SAX (salte algunas líneas / etiquetas)
  • Error de generación de Gradle: SAXParseException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.