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:
- XmlPullParser obtener nodos secundarios
- ¿Existe una manera de enumerar las funciones XMLPullParser disponibles en el dispositivo Android actual?
- XmlPullParserException al analizar un archivo de recursos en Android
- XmlPullParserException sólo en ICS
- Android org.xmlpull.v1.XmlPullParserException al analizar 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
- Android ksoap llamada xmlpullparser excepción
- XmlPullParser obtener archivo del sistema de archivos
- Obtener stringXmlContent y escribir a continuación, guardado en el archivo .xml almacenado en sdcard en android ¿cómo se puede?
- Cómo crear un AttributeSet en Android?
- Xml getText devolver null - Android
- XmlPullParser: PI no debe comenzar con xml, pero solo en Android 2.3.3 hacia abajo
- KXmlParser lanza la excepción "Símbolo inesperado" al inicio de RSS pasing
- XmlPullParser: obtener texto interno incluyendo etiquetas XML
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);