KXmlParser lanza la excepción "Símbolo inesperado" al inicio de RSS pasing

Estoy tratando de analizar un feed RSS de Monster en Android v.17 usando esta URL:

Http://rss.jobsearch.monster.com/rssquery.ashx?q=java

Para obtener el contenido que estoy usando HttpUrlConnection de la siguiente manera

this.conn = (HttpURLConnection) url.openConnection(); this.conn.setConnectTimeout(5000); this.conn.setReadTimeout(10000); this.conn.setUseCaches(true); conn.addRequestProperty("Content-Type", "text/xml; charset=utf-8"); is = new InputStreamReader(url.openStream()); 

Lo que vuelve es lo más lejos que puedo decir (y lo he verificado también) un legítimo RSS

 Cache-Control:private Connection:Keep-Alive Content-Encoding:gzip Content-Length:5958 Content-Type:text/xml Date:Wed, 06 Mar 2013 17:15:20 GMT P3P:CP=CAO DSP COR CURa ADMa DEVa IVAo IVDo CONo HISa TELo PSAo PSDo DELa PUBi BUS LEG PHY ONL UNI PUR COM NAV INT DEM CNT STA HEA PRE GOV OTC Server:Microsoft-IIS/7.5 Vary:Accept-Encoding X-AspNet-Version:2.0.50727 X-Powered-By:ASP.NET 

Comienza así (haga clic en la URL anterior si desea ver el XML completo):

 <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>Monster Job Search Results java</title> <description>RSS Feed for Monster Job Search</description> <link>http://rss.jobsearch.monster.com/rssquery.ashx?q=java</link> 

Pero cuando intento analizarlo:

 final XmlPullParser xpp = getPullParser(); xpp.setInput(is); for (int type = xpp.getEventType(); type != XmlPullParser.END_DOCUMENT; type = xpp.next()) { /* pasing goes here */ } 

El código se ahoga inmediatamente en type = xpp.next() con la siguiente excepción

 03-06 09:27:27.796: E/AbsXmlResultParser(13363): org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT @1:2 in java.io.InputStreamReader@414b4538) 

Lo que realmente significa que no puede procesar el segundo carácter en la línea 1 <?xml version="1.0" encoding="utf-8"?>

Aquí están las líneas ofensivas en el KXmlParser.java (425-426). El tipo == TEXT se evalúa como true

 if (depth == 0 && (type == ENTITY_REF || type == TEXT || type == CDSECT)) { throw new XmlPullParserException("Unexpected token", this, null); } 

¿Alguna ayuda? XmlPullParser.FEATURE_PROCESS_DOCDECL = false fijar el parser a XmlPullParser.FEATURE_PROCESS_DOCDECL = false pero eso no ayudó

Investigué esto en la web y aquí y no puedo encontrar nada que ayude

La razón por la que está recibiendo el error es que el archivo xml realmente no comienza con <?xml version="1.0" encoding="utf-8"?> . Comienza con tres bytes especiales EF BB BF que son Byte order mark .

Representación hexadecimal

InputStreamReader no maneja estos bytes automáticamente, por lo que tiene que manejarlos manualmente. La forma más sencilla de hacerlo es utilizar BOMInpustStream disponible en la biblioteca de Commons IO :

 this.conn = (HttpURLConnection) url.openConnection(); this.conn.setConnectTimeout(5000); this.conn.setReadTimeout(10000); this.conn.setUseCaches(true); conn.addRequestProperty("Content-Type", "text/xml; charset=utf-8"); is = new InputStreamReader(new BOMInputStream(conn.getInputStream(), false, ByteOrderMark.UTF_8)); 

He comprobado el código de arriba y funciona bien para mí.

  • ¿Por qué Android XmlPullParser REALMENTE lento en mi dispositivo más antiguo?
  • ¿Cómo extracto el texto de un xml anidado usando xmlpullparser en android?
  • XmlPullParserException sólo en ICS
  • ¿Existe una manera de enumerar las funciones XMLPullParser disponibles en el dispositivo Android actual?
  • ArrayIndexOutOfBoundsException en el KXmlParser de android
  • Xml extraer elementos del analizador xml
  • XmlPullParser: PI no debe comenzar con xml, pero solo en Android 2.3.3 hacia abajo
  • XmlPullParser obtener nodos secundarios
  • XmlPullParserException al analizar un archivo de recursos en Android
  • Cómo obtener un valor de nodo con XmlPullParser
  • XmlPullParser: obtener texto interno incluyendo etiquetas XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.