2010-04-26 3 views
5

Ho un problema strano. Ricevo il seguente errore che causa una forza da vicino:Parse Eccezione: alla linea 1, colonna 0: nessun elemento trovato

org.apache.harmony.xml.ExpatParser $ ParseException: alla linea 1, colonna 0: trovato alcun elemento a org.apache.harmony.xml.ExpatParser .parseFragment (ExpatParser.java:508) a org.apache.harmony.xml.ExpatParser.parseDocument (ExpatParser.java:467) a org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:329) a org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:286)

Dopo aver cliccato sul pulsante Chiudi Forza, l'attività viene ricreata e l'analisi completa senza intoppi. Sto utilizzando il seguente frammento di codice all'interno di un doInBackground AsyncTask:

URL serverAddress = new URL(url[0]); 

HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 
connection.setReadTimeout(10000); 
connection.connect(); 

InputStream stream = connection.getInputStream(); 

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 

XMLReader xr = sp.getXMLReader(); 

xr.parse(new InputSource(stream)); // The line that throws the exception 

Perché la forza-chiusura di attività e quindi eseguire senza problemi subito dopo? BufferedInputStream sarebbe diverso? Sono sconcertato. :(

Grazie per il vostro tempo tutti

Aggiornamento:.. Si scopre HttpURLConnection.getResponseCode effettuata() restituisce -1 ogni tanto, in modo che l'InputStream probabilmente non è di essere correttamente impostata

+0

Sembra che lo stream sia nullo, puoi scaricarne il contenuto su System.out.println con IOUtils comuni? – Jon

+0

È un copypaste? 'HTTPURLConnection'! =' HttpURLConnection'. – BalusC

+0

Quello era un refuso, HttpURLConnection risolto. Mi dispiace per quello – jeffh

risposta

5
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 

Quelle linee sono un po 'strano. È HTTPURLConnection o HttpURLConnection? Il metodo di richiesta predefinito è già GET. Il setDoOutput(true) sarà tuttavia costringerlo a POST.

mi piacerebbe sostituire tutte quelle linee da

URLConnection connection = serverAddress.openConnection(); 

e riprovare. Potrebbe accadere che esso ha restituito un errore perché è costretto POST e non hanno scritto nulla per l'uscita (il corpo della richiesta). Il connection.connect() è tra l'altro già implicitamente chiamato da connection.getInputStream(), in modo che la linea è superfluo pure.

Aggiornamento: a scopo di test funziona quanto segue?

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
for (String line; (line = reader.readLine()) != null;) { 
    System.out.println(line); 
} 
reader.close(); 
+0

Grazie BalusC, estremamente informativo. Apporterà le modifiche e gli darà un colpo. Ciò che è interessante è che la maggior parte delle volte l'XML analizza senza intoppi. È quasi una fortuna per l'estrazione di un'eccezione lanciata ... anche se sembra succedere abbastanza spesso per essere un problema. – jeffh

+0

Dopo aver apportato le modifiche, il comportamento forzato esiste ancora. Sembra che il parser non stia analizzando nulla. Connettersi con il debugger per arrivare alla fine di questo. – jeffh

+0

Per quanto riguarda l'aggiornamento, dovrebbe funzionare, ma penso che System.util.Log sia utilizzato al posto di System.out in Android. Testerà e aggiornerà il post originale. Grazie! – jeffh

1

Per InputStream javadoc il metodo bloccherà fino a quando i dati saranno disponibili o l'EOF. Quindi, l'altro lato di Socket deve chiuderlo - quindi la chiamata inStream.read() restituirà

Se si utilizza BufferedReader, è possibile leggere riga per riga, il metodo readLine() verrà restituito in questo modo acceso come una linea dalla risposta HTTP viene letto.

+0

Grazie al portatore dell'anello, esamineremo ulteriormente. – jeffh

1

In una nota correlata disegno, caricando contenuti di un URL non dovrebbe mai influire chiudere un'attività - vi consiglio di mettere tutto questo in un'implementazione AsyncTask e riferire o riprovare dopo si torna sul thread GUI.

+0

Concordato. Lo snippet di codice nel post originale risiede in doInBackground di un AsyncTask. – jeffh

2

I dont' sapere se risolto questo, ma ho avuto lo stesso problema. Era strano, che avrebbe funzionato bene nell'emulatore, ma poi al telefono, è stato sempre mi dà l'errore xr.parse(). Anche quando ho stampato il InputStream mi darebbe l'output legittimo del documento xml.Il problema era nella creazione dell'oggetto InputSource

Ecco come l'ho risolto: invece di usare InputStream per creare il tuo InputSource ho appena creato l'origine di input direttamente dalla stringa dell'URL.

InputSource a = new InputSource(url_string); 

dove URL_STRING è solo una stringa con il vostro URL. Non chiedermi perché funzioni ... Non mi piace molto, perché non c'è modo di controllare i timeout e cose del genere sembra. Ma funziona, fammi sapere come va!

+0

Grazie per la risposta. Non penso che funzionerà in modo specifico per il mio caso, perché ho bisogno di usare HttpURLConnection.setRequestProperty(). Ho risolto temporaneamente il problema controllando il codice di risposta e riprovando la connessione se il codice è -1. Il tuo contributo potrebbe aiutare gli altri! – jeffh

0

Mi sono imbattuto nello stesso problema e non riuscivo a capirlo perché stavo analizzando direttamente da InputSource. Quando ho modificato il codice per estrarre il risultato in una stringa prima dell'analisi xml, ho scoperto che il problema era semplicemente un nome del metodo di servizio Web con mispelle e che il messaggio di errore riportato da quel servizio era l'assassino.

1

Anche io ho affrontato lo stesso problema. Inizialmente utilizzavo lo InputStream in Scanner per stamparne il contenuto. E poi cercando di passarlo nel parser XML.

Il problema era che non stavo chiudendo l'oggetto Scanner. E usando il nel parser.

Dopo aver chiuso l'oggetto dello scanner, sono stato in grado di risolvere questo problema.