XmlPullParser - 意外令牌(android)

时间:2014-03-16 15:00:28

标签: android xml xmlpullparser

我正在开发一个应用程序,它将从我在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 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)

我花了几个小时在谷歌试图解决它,但我仍然不知道,有人能指出我的问题在哪里?

由于

4 个答案:

答案 0 :(得分:5)

我认为错误可能来自您已设置为XmlPullParser的编码。

此行不正确:xpp.setInput(in, "UTF_8");。它应该是:xpp.setInput(in, "UTF-8");。如果它没有帮助,您甚至可以尝试通过以下方式更改这两行:

InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
xpp.setInput(in, null);

答案 1 :(得分:3)

不确定你是否仍然坚持这一点。我至少有类似的问题。我不会说我找到了 解决方案,但我发现了一个对我的情况有帮助的解决方法。我认为我们遇到同样问题的原因是因为它在异常中所说的内容。@ 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能够解析我的文件而没有任何例外。

希望有所帮助,祝你好运。

答案 2 :(得分:1)

对于我来说,在我删除了xml文件中的前3个字节(BOM = 0xEF BB BF)后,错误消失了。

答案 3 :(得分:0)

我有同样的错误,我只是从doInBackground()方法中删除了附加的字符串! 是:

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

现在:

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