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

2 Solutions collect form web for “XmlPullParser – token inesperado (android)”

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); 
  • XmlPullParser obtener nodos secundarios
  • Diferencia entre el analizador XML SAX, analizador de tracción y analizador de DOM en android
  • Cómo analizar un feed RSS con XmlPullParser?
  • Error desconocido en xpath (utilizando xmlpullparser)
  • XmlPullParser obtener archivo del sistema de archivos
  • Net.sqlcipher.database.SQLiteException: no es un error:
  • Parser SAX vs analizador XMLPull
  • ¿Por qué Android XmlPullParser REALMENTE lento en mi dispositivo más antiguo?
  • XmlPullParser: PI no debe comenzar con xml, pero solo en Android 2.3.3 hacia abajo
  • XmlPullParser getAttributeValue devuelve null
  • 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.