2012-01-11 14 views
5

Sto creando un'applicazione Android che legge Internet XML. Questa applicazione utilizza SAX per analizzare XML. Questo è il mio codice per la parte di analisi:

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); 
    } 
} 

Il problema è che si verifica SAXException. Il messaggio di eccezione è la seguente:

org.apache.harmony.xml.ExpatParser$ParseException: At line 4, column 42: not well-formed (invalid token)

Tuttavia, se metto lo stesso codice in una normale applicazione Java SE, questa eccezione non si verifica e tutto funziona bene.

Perché lo stesso codice funziona correttamente in un'applicazione Java SE, non in Android ?. D'altra parte, come risolvere il problema?

Grazie per l'aiuto.

Saluti.

+0

Puoi condividere ur xml ... e come per errore c'è un problema con ur xml .. –

+0

@MohitSharma Ma, perché lo stesso codice funziona bene in un'applicazione Java SE, non in un Android ?. Questo è l'URL: http://www.aemet.es/xml/municipios/localidad_33002.xml – Lobo

+0

originale ho pensato che ci sia qualche problema con ur xml come da errore .. ma non è così ... ora solo soluzione con te hai eseguito il debug dell'analisi –

risposta

11

Questo potrebbe essere un problema di codifica dei caratteri.
Come si può vedere, l'errore token non valido punta alla riga n.
In questa riga, è possibile trovare un acuto (Meteorologia) e una tilde (España). L'intestazione XML mostra un valore di codifica ISO-8859-15. Poiché è meno comune delle codifiche UTF o ISO-8859-1, ciò potrebbe causare un errore quando SAXParser si connette e tenta di convertire il contenuto in byte in char utilizzando il set di caratteri predefinito del sistema.

Quindi, è necessario comunicare al SAXParser quale set di caratteri utilizzare. Un modo per farlo è passare un InputSource, anziché l'URL, al metodo di analisi. Per fare un esempio:

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); 

EDIT: Sembra che Android VM non supporta questa codifica, lanciando un'eccezione org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unknown encoding.
Come ISO-8859-15 è principalmente compatibile con ISO-8859-1, ad eccezione di alcuni caratteri specifici (come è possibile vedere here), una soluzione alternativa è modificare il valore ISO-8859-15 in ISO-8859-1 con il metodo setEncoding, forzando il parser a utilizzare un diverso ma compatibile codifica charset:

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

a quanto pare, come Android non supporta il set di caratteri dichiarato, utilizza la sua impostazione predefinita (UTF-8) e quindi il parser non può utilizzare la dichiarazione XML di scegliere la codifica apropiate.

+1

Ciao @ tomas-narros, grazie, ci proverò e noterai il risultato. – Lobo

+3

Il parser non dovrebbe utilizzare precocemente la dichiarazione XML per scegliere la codifica appropriata? –

+1

Questo è un buon punto @ JB. Di sicuro dovrebbe. Ma sono abbastanza sicuro che questo è un problema di codifica. –