XmlPullParser – token inesperado (android)

Estoy desarrollando una aplicación, que leerá desde xml que he storied en res / xml / experiment.xml, pero cuando intento analizarlo, me da una xmlPullParserException.

Aquí está mi realmente simple archivo xml:

<?xml version="1.0" encoding="utf-8"?> <message>Hello</message> 

Aquí está mi código:

  public static void parse(Context ctx) throws XmlPullParserException, IOException { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); InputStream in = ctx.getResources().openRawResource(R.xml.experiment); xpp.setInput(in, "UTF_8"); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName = xpp.getName(); switch (eventType) { case XmlPullParser.START_TAG: Log.d("debug", "Entering tag: " + tagName); break; case XmlPullParser.TEXT: Log.d("debug", "Text inside: " + xpp.getText()); break; case XmlPullParser.END_TAG: Log.d("debug", "Ending tag: " + tagName); break; } eventType = xpp.next(); } } 

Y aquí está la excepción que me lanza:

  03-16 15:38:52.759: W/System.err(28087): org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT ???????????????8??????...@2:112 in java.io.InputStreamReader@42604888) 03-16 15:38:52.759: W/System.err(28087): at org.kxml2.io.KXmlParser.next(KXmlParser.java:426) 03-16 15:38:52.759: W/System.err(28087): at org.kxml2.io.KXmlParser.next(KXmlParser.java:310) 03-16 15:38:52.759: W/System.err(28087): at xmlparsing.Xmlreader.parse(Xmlreader.java:53) 03-16 15:38:52.759: W/System.err(28087): at com.example.androidexperiments.Lifecycle.onCreate(Lifecycle.java:28) 03-16 15:38:52.759: W/System.err(28087): at android.app.Activity.performCreate(Activity.java:5231) 03-16 15:38:52.759: W/System.err(28087): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.access$800(ActivityThread.java:135) 03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 03-16 15:38:52.759: W/System.err(28087): at android.os.Handler.dispatchMessage(Handler.java:102) 03-16 15:38:52.759: W/System.err(28087): at android.os.Looper.loop(Looper.java:136) 03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.main(ActivityThread.java:5017) 03-16 15:38:52.759: W/System.err(28087): at java.lang.reflect.Method.invokeNative(Native Method) 03-16 15:38:52.759: W/System.err(28087): at java.lang.reflect.Method.invoke(Method.java:515) 03-16 15:38:52.759: W/System.err(28087): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 03-16 15:38:52.759: W/System.err(28087): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 03-16 15:38:52.759: W/System.err(28087): at dalvik.system.NativeStart.main(Native Method) 

Paso algunas horas en google tratando de resolverlo, pero todavía no tengo idea, ¿alguien puede señalarme dónde está el problema?

Gracias

no estoy seguro de si todavía estás atrapado en esto. Tuve por lo menos un problema similar. No diría que he encontrado la solución, pero he encontrado una solución que ayudó en mi situación de todos modos. La razón por la que creo que tenemos el mismo problema es por lo que dice en la excepción .. @ 2: 112. Como usted probablemente sabe que significa fila 2, columna 112 de la entrada. Teniendo en cuenta la brevedad de su entrada xml, esto es obviamente ridículo como su segunda línea de entrada no tiene en cualquier lugar cerca de 112 columnas. Yo estaba viendo una posición similarmente falsa en mi excepción de mi entrada simple.

Creo que el problema podría ser la forma en que está adquiriendo el InputStream:

 InputStream in = ctx.getResources().openRawResource(R.xml.experiment); 

Si se toma el tiempo para convertir la entrada en el InputStream a un String (código para esto se puede encontrar), verá que cada línea devuelve datos falsos; hay una gran cantidad de caracteres basura mezclados con caracteres de datos xml. No sé por qué. Tal vez alguien más versado en Java puede responder a eso .. Sospecho que es porque el archivo xml se está abriendo como un recurso en bruto (al igual que dice) y tiene que ser abierto con algún tipo de codificación, como utf-8 para traducir correctamente De todos modos, cuando utilicé la función .openRawResource(..) , parecía venir con una gran cantidad de datos basura en el InputStream, que sofocó el XmlPullParser. Mi solución a esto era mover el archivo .xml de la carpeta res/xml/ a la carpeta de assets . Entonces adquirí el InputStream de esta manera.

 InputStream in = this.getAssets().open("sample.xml"); 

Cuando lo hice, me di cuenta de que no había caracteres chatarra en el InputStream, y XmlPullParser fue capaz de analizar mi archivo sin excepciones.

Espero que ayude, buena suerte.

Creo que el error podría provenir de la codificación que estableció en su XmlPullParser .

Esta línea es incorrecta: xpp.setInput(in, "UTF_8"); . Debe ser: xpp.setInput(in, "UTF-8"); . Si no ayuda, puede incluso intentar cambiar esas dos líneas por:

 InputStream in = ctx.getResources().openRawResource(R.xml.experiment); xpp.setInput(in, null); 
  • Cómo analizar un feed RSS con XmlPullParser?
  • Parser SAX vs analizador XMLPull
  • Cómo obtener un valor de nodo con XmlPullParser
  • ArrayIndexOutOfBoundsException en el KXmlParser de android
  • XmlPullParser getAttributeValue devuelve null
  • ¿Cómo extracto el texto de un xml anidado usando xmlpullparser en android?
  • Net.sqlcipher.database.SQLiteException: no es un error:
  • XmlPullParser no funciona con InputStream
  • XmlPullParser - Analizar etiqueta analizada
  • ¿Cómo puedo analizar XML android?
  • Diferencia entre el analizador XML SAX, analizador de tracción y analizador de DOM en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.