XmlPullParser - 意外令牌(android)

Dav*_*vák 5 xml android xmlpullparser

我正在开发一个应用程序,它将从我在res/xml/experiment.xml中存储的xml中读取,但是当我尝试解析它时,它给了我一个xmlPullParserException.

这是我非常简单的xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <message>Hello</message>
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

    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();
    }

}
Run Code Online (Sandbox Code Playgroud)

以下是它抛出的异常:

    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)
Run Code Online (Sandbox Code Playgroud)

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

谢谢

nKn*_*nKn 5

我认为错误可能来自你设置的编码XmlPullParser.

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

InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
xpp.setInput(in, null);
Run Code Online (Sandbox Code Playgroud)


yan*_*ano 5

不确定你是否还停留在这个问题上。我至少也遇到过类似的问题。我不会说我已经找到了解决方案,但我已经找到了一种对我的情况有所帮助的解决方法。我认为我们遇到同样问题的原因是因为它在异常中所说的..@2:112。您可能知道,这意味着输入的第 2 行、第 112 列。考虑到您的 xml 输入的简洁性,这显然是荒谬的,因为您的第二行输入没有接近 112 列。从我的简单输入中,我在异常中看到了类似的虚假位置。

我认为问题可能是您获取 InputStream 的方式:

InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
Run Code Online (Sandbox Code Playgroud)

如果您花时间将 InputStream 中的输入转换为字符串(可以找到此代码),您将看到每一行都返回虚假数据;xml 数据字符中混杂着大量垃圾字符。我不知道为什么。也许更精通Java的人可以回答这个问题..我怀疑这是因为xml文件被作为原始资源打开(就像它所说的那样)并且需要使用某种编码打开,例如utf-8来翻译正确吗..?无论如何,当我使用该.openRawResource(..)函数时,它似乎在InputStream中带有大量垃圾数据,这使XmlPullParser窒息。我的解决方案是将 .xml 文件从该res/xml/文件夹移动到该assets文件夹​​。然后我就以这种方式获取了InputStream。

InputStream in = this.getAssets().open("sample.xml");
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我注意到 InputStream 中没有垃圾字符,并且 XmlPullParser 能够毫无异常地解析我的文件。

希望有帮助,祝你好运。