2010-04-26 24 views
5

Tengo un problema extraño. Recibo el siguiente error que provoca una fuerza de cierre:Parse Excepción: en la línea 1, columna 0: no se ha encontrado ningún elemento

org.apache.harmony.xml.ExpatParser $ ParseException: En la línea 1, columna 0: ningún elemento que se encuentra en org.apache.harmony.xml.ExpatParser .parseFragment (ExpatParser.java:508) en org.apache.harmony.xml.ExpatParser.parseDocument (ExpatParser.java:467) en org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:329) en org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:286)

Después de hacer clic en el botón Cerrar de la fuerza, la actividad se recrea y el análisis se completa sin ningún problema. Estoy usando el siguiente fragmento de código dentro de 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 

¿Por qué la fuerza de cerca la actividad y luego ejecutar sin problemas inmediatamente después? ¿Sería un BufferedInputStream diferente? Estoy desconcertado. :(

Gracias por su tiempo todo el mundo

Actualización:.. Resulta HttpURLConnection.getResponseCode() devuelve -1 cada cierto tiempo, por lo que el InputStream probablemente no se está estableciendo correctamente

+0

Parece que la transmisión es nula, ¿puedes volcar el contenido de la misma en System.out.println con commons IOUtils? – Jon

+0

¿Es esto una pasta de copiar? 'HTTPURLConnection'! =' HttpURLConnection'. – BalusC

+0

Eso fue un error tipográfico, HttpURLConnection corregido. Lo siento por eso. – jeffh

Respuesta

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

Esas líneas son un poco raras. ¿Es HTTPURLConnection o HttpURLConnection? El método de solicitud predeterminado ya es GET. El setDoOutput(true) lo forzará sin embargo a POST.

me gustaría reemplazar todas esas líneas por

URLConnection connection = serverAddress.openConnection(); 

y vuelva a intentar. Puede suceder que devuelva un error porque forzó POST y no escribió nada en la salida (el cuerpo de la solicitud). Por cierto, el connection.connect() ya ha sido invocado implícitamente por connection.getInputStream(), por lo que esa línea también es superflua.

Actualización: ¿funciona lo siguiente para fines de prueba?

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

Gracias BalusC, extremadamente informativo. Hará los cambios y le dará una oportunidad. Lo que es interesante, es que la mayoría de las veces el XML analiza sin problemas. Es casi una suerte tener una excepción lanzada ... aunque parece ser lo suficientemente frecuente como para ser un problema. – jeffh

+0

Después de realizar los cambios, el comportamiento de cierre forzado aún existe. Parece que el analizador no está analizando nada. Enlazando con el depurador para llegar al fondo de esto. – jeffh

+0

En cuanto a la actualización, debería funcionar, pero creo que System.util.Log se utiliza en lugar de System.out en Android. Probará y actualizará la publicación original. ¡Gracias! – jeffh

1

por InputStream . javadoc el método bloqueará hasta que los datos está disponible o se encuentra el EOF Por lo tanto, al otro lado del zócalo debe cerrarse ella -. entonces el inStream.read() devolverá

Si utiliza BufferedReader, puede leer en una línea por línea. El método readLine() volverá como tal en que se lee una línea de respuesta HTTP.

+0

Gracias anillo portador, se verá más a fondo. – jeffh

1

En una nota de diseño relacionado, cargando contenido de un URL nunca debería cerrar una actividad - recomiendo poner todo esto en una aplicación y AsyncTask informe o intentarlo después de que están de vuelta en el hilo de interfaz gráfica de usuario.

+0

De acuerdo. El fragmento de código en la publicación original reside en doInBackground de una AsyncTask. – jeffh

2

No sé si solucionó esto, pero tuve el mismo problema. Era extraño, funcionaría bien en el emulador, pero luego, en el teléfono, siempre me estaba dando el error xr.parse(). Incluso cuando imprimí el InputStream me daría una salida legítima del documento xml.Parecía que el problema estaba en la creación del objeto InputSource

Así es como me fijo: en lugar de utilizar para crear su InputStream acabo de fuente de entrada creado InputSource de la cadena URL directamente.

InputSource a = new InputSource(url_string); 

donde url_string es solo una cadena con su url. No me preguntes por qué funciona ... Realmente no me gusta, ya que no hay manera de verificar los tiempos de espera y cosas así parece. Pero funciona, avísame cómo va!

+0

Gracias por su respuesta. No creo que funcione específicamente para mi caso, porque necesito usar HttpURLConnection.setRequestProperty(). He solucionado temporalmente el problema al verificar el código de respuesta y volver a intentar la conexión si el código es -1. ¡Tu opinión puede ayudar a otros sin embargo! – jeffh

0

Me encontré con el mismo problema y podría no tener sentido porque estaba analizando directamente desde el InputSource. Cuando modifiqué el código para convertir el resultado en una cadena antes del análisis de xml, descubrí que el problema era simplemente un nombre incorrecto del método de servicio web y que el mensaje de error informado por ese servicio era el asesino.

1

Incluso yo enfrenté el mismo problema. Estaba usando por primera vez el InputStream en Scanner para imprimir el contenido del mismo. Y luego intenta pasarlo en el analizador XML.

El problema era que no estaba cerrando el objeto Scanner. Y usando el Inputstream en el analizador.

Después de cerrar el objeto del escáner, pude solucionar este problema.

Cuestiones relacionadas