KXmlParser arroja una excepción de “Token inesperado” al comienzo de RSS pasing

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

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

Para obtener el contenido, 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, por lo que puedo decir (y lo he verificado también), un RSS legítimo

 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 de arriba si desea ver el XML completo):

    Monster Job Search Results java RSS Feed for Monster Job Search http://rss.jobsearch.monster.com/rssquery.ashx?q=java 

Pero cuando bash 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 bloquea de inmediato 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) 

¿Qué significa en realidad que no puede procesar el segundo carácter en la línea 1

Aquí están las líneas ofensivas en 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 establecer el analizador en XmlPullParser.FEATURE_PROCESS_DOCDECL = false pero eso no ayudó

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

La razón por la que recibe el error es que el archivo xml en realidad no comienza con . Comienza con tres bytes especiales EF BB BF que son Byte order mark .

Representación hexagonal

InputStreamReader no maneja estos bytes automáticamente, por lo que debe manejarlos manualmente. La forma más simple de hacerlo es usar BOMInpustStream disponible en la biblioteca 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)); 

Revisé el código anterior y me funciona bien.