XmlPullParser - 意外令牌(android)

男儿欲遂平生志,五经勤向窗前读。这篇文章主要讲述XmlPullParser - 意外令牌(android)相关的知识,希望能为你提供帮助。
我正在开发一个应用程序,它将从我在res / xml / experiment.xml中存储的xml中读取,但是当我尝试解析它时,它给了我一个xmlPullParserException。
这是我非常简单的xml文件:

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

这是我的代码:
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(); }}

以下是它抛出的异常:
03-16 15:38:52.759: W/System.err(28087): org.xmlpull.v1.XmlPullParserException:Unexpected token (position:TEXT ???????????????8??????...@2:112 injava.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):atorg.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)

我花了几个小时在谷歌试图解决它,但我仍然不知道,有人可以指出我的问题在哪里?
【XmlPullParser - 意外令牌(android)】谢谢
答案不确定你是否仍然坚持这一点。我至少有类似的问题。我不会说我已经找到了解决方案,但我找到了一个解决方案,无论如何都有助于我的情况。我认为我们遇到同样问题的原因是因为它在异常中所说的内容。@ 2:112。您可能知道这意味着输入的第2行第112列。考虑到你的xml输入的简洁性,这显然是荒谬的,因为你的第二行输入没有接近112列。从我的简单输入中我看到了一个类似虚假的异常位置。
我认为问题可能是你获取InputStream的方式:
InputStream in = ctx.getResources().openRawResource(R.xml.experiment);

如果您花时间将InputStream中的输入转换为String(可以找到此代码),您将看到每行返回虚假数据; 有很多垃圾字符与xml数据字符混合在一起。我不知道为什么。也许更熟悉Java的人可以回答这个问题。我怀疑是因为xml文件是作为原始资源打开的(就像它说的那样)并且它需要用某种编码打开,比如utf-8要翻译它正确..?无论如何,当我使用.openRawResource(..)函数时,它似乎在InputStream中带来了大量的垃圾数据,这会阻塞XmlPullParser。我的解决方案是将.xml文件从res/xml/文件夹移动到assets文件夹。然后我以这种方式获得了InputStream。
InputStream in = this.getAssets().open("sample.xml");

当我这样做时,我注意到InputStream中没有垃圾字符,并且XmlPullParser能够解析我的文件而没有任何异常。
希望有所帮助,祝你好运。
另一答案我认为错误可能来自您设置为XmlPullParser的编码。
这行不正确:xpp.setInput(in, "UTF_8"); 。它应该是:xpp.setInput(in, "UTF-8"); 。如果它没有帮助,您甚至可以尝试通过以下方式更改这两行:
InputStream in = ctx.getResources().openRawResource(R.xml.experiment); xpp.setInput(in, null);

另一答案我有同样的错误,我只是从我的doInBackground()方法中删除了附加的字符串!它是 :
@Override protected String doInBackground(String... strings) { Log.d(TAG, "doInBackground: starts with: " + strings[0]); String rssFeed = downloadXML(strings[0]); return "test: "+rssFeed; }

现在:
@Override protected String doInBackground(String... strings) { Log.d(TAG, "doInBackground: starts with: " + strings[0]); String rssFeed = downloadXML(strings[0]); return rssFeed; }


    推荐阅读