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
- Analizador XML personalizado de Android falla al resolver el espacio de nombres android
- XmlPullParser - token inesperado (android)
- XmlPullParser getAttributeValue devuelve null
- Manejando espacios de nombres Xml con XmlPullParser
- XmlPullParser no funciona con InputStream
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
- Cómo crear un AttributeSet en Android?
- Cómo analizar un feed RSS con XmlPullParser?
- XmlPullParser - Analizar etiqueta analizada
- Obtener stringXmlContent y escribir a continuación, guardado en el archivo .xml almacenado en sdcard en android ¿cómo se puede?
- Net.sqlcipher.database.SQLiteException: no es un error:
- ¿Cómo puedo analizar XML android?
- Android org.xmlpull.v1.XmlPullParserException al analizar XML
- Android: El mejor analizador para analizar datos XML
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
.
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í.
- ¿Cuál es el directorio de trabajo predeterminado para adb push / pull y cómo lo cambio?
- Animación de elementos de menú en ActionBar