Pregunta Sax - ExpatParser $ ParseException


Estoy haciendo una aplicación de Android que lee un Internet XML. Esta aplicación utiliza SAX para analizar XML. Este es mi código para la parte de análisis:

public LectorSAX(String url){
    try{
        SAXParserFactory spf=SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        DefaultHandler lxmlr=new LibraryXMLReader() ;
        sp.parse(url, lxmlr);

        nodo=((LibraryXMLReader)lxmlr).getNodoActual();

    }catch(ParserConfigurationException e){ 
        System.err.println("Error de parseo en LectorSAX.java: "+e);
    }catch(SAXException e){
        System.err.println("Error de sax LectorSAX.java: " + e);
    } catch (IOException e){
        System.err.println("Error de  io LectorSAX.java: " + e);
    }
}

El problema es que ocurre SAXException. El mensaje de excepción es el siguiente:

org.apache.harmony.xml.ExpatParser $ ParseException: En la línea 4, columna   42: no está bien formado (token no válido)

Sin embargo, si pongo el mismo código en una aplicación Java SE normal, esta excepción no se produce y todo funciona bien.

¿Por qué el mismo código funciona bien en una aplicación Java SE, no en un Android? Por otro lado, ¿cómo solucionar el problema ?.

Gracias por la ayuda.

Saludos.


5
2018-01-11 21:36


origen


Respuestas:


Esto podría ser un problema de codificación de caracteres.
Como puede ver, el error de token no válido apunta a la línea # 4.
En esta línea, puedes encontrar un agudo (Meteorología) y una tilde (España) El encabezado XML muestra una ISO-8859-15 valor de codificación. Como es menos común que las codificaciones UTF o ISO-8859-1, esto podría generar un error cuando el SAXParser se conecte e intente convertir el contenido de bytes en caracteres utilizando el juego de caracteres predeterminado del sistema.

Luego, deberá indicar al SAXParser qué conjunto de caracteres debe usar. Una forma de hacerlo, es pasar una Fuente de entrada, en lugar de la URL, al método de análisis. Como ejemplo:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

InputSource is = new InputSource(url);
is.setEncoding("ISO-8859-15");

DefaultHandler lxmlr=new LibraryXMLReader() ;
sp.parse(is, lxmlr);

EDITAR: Parece que la máquina virtual de Android no admite esta codificación, lanzando un org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unknown encoding excepción.
Como ISO-8859-15 es principalmente compatible con ISO-8859-1, excepto algunos caracteres específicos (como puede ver aquí), una solución está cambiando el ISO-8859-15 valor para ISO-8859-1 en el método setEncoding, obligando al analizador a usar una codificación de caracteres diferente pero compatible:

is.setEncoding("ISO-8859-1");

Como parece, como Android no admite el conjunto de caracteres declarado, utiliza su valor predeterminado (UTF-8) y, por lo tanto, el analizador no puede usar la declaración XML para elegir la codificación apropiada.


11
2018-01-17 11:45