【问题标题】:Does XmlPullParser need special treatment for 2.3.3 and older Android versions?XmlPullParser 是否需要对 2.3.3 和更早的 Android 版本进行特殊处理?
【发布时间】:2012-11-24 08:08:25
【问题描述】:

我正在通过XmlPullParser 使用如下代码从远程 XML 文件中提取内容:

    factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    parser = factory.newPullParser();
    parser.setInput(xml, "UTF-8");

    eventType = parser.getEventType();

    // process tag while not reaching the end of document
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            // at start of document: START_DOCUMENT
            case XmlPullParser.START_DOCUMENT:
                break;
            // at start of a tag: START_TAG
            case XmlPullParser.START_TAG:
                //get tag name
                String tagName = parser.getName();
                if (tagName.equalsIgnoreCase("item")) {
                    listObject = new MyClass();
                } else if (tagName.equalsIgnoreCase("yy")) {
                    listObject.setYY(parser.nextText());
                } else if (tagName.equalsIgnoreCase("zz")) {
                    listObject.setZZ(parser.nextText());
                } 
                break;
        }
        // jump to next event
        eventType = parser.next();

如您所见,此代码中没有新的或奇怪的地方。

现在,在 Android 3.0 和更新的系统上,当获取的 XML 内容进入这个解析器时,它们看起来“正常”,就像这张图片一样:

您可以看到 XML 文件的内容已被正确提取。

但是当我将同一个项目连接到 Android 2.3.3 或更早版本的设备时,我得到了一个不同的结果!查看在 Android 2.2 设备上拍摄的相同图像。

你看到这些奇怪的字符\uoooo!另外buffer 项目已更改为txtBuf

这一切意味着什么?为什么在 Android 2.3.3 以下会发生这种情况以及如何解决这个问题?这会破坏我的解析器并杀死我的应用程序。

【问题讨论】:

  • 你确定未解析的内容在 2.3 前后是一样的吗?
  • @Alex 第一个是安卓4.0.3,后一个是安卓2.2。昨晚我检查了Android 2.3.3,它与Android 2.2 相同。我不知道该怎么做。我无法弄清楚我们的原因是什么?! PullParser、服务器还是别的什么?
  • 如果您解析相同的文件但将其放在本地资产中,这可能会有所帮助,以确保它不是 http 问题
  • @Alex 我还注意到 XML 文件的 URL 不是以 file.xml 结尾,而是以 file.ashx 结尾。这可能是一个生成 XML 的 ASP.NET 服务器脚本。这会导致问题吗?
  • @Alex 它在本地解析,没有任何问题。有什么建议吗?

标签: android xml-parsing android-2.2-froyo android-2.3-gingerbread xmlpullparser


【解决方案1】:

修改你的解析:

XmlPullParser xpp = XmlPullParserFactory.newInstance().newPullParser();
xpp.setInput(xml, "UTF-8");

while (xpp.getEventType() != XmlPullParser.END_DOCUMENT)
{
    if (xpp.getEventType() == XmlPullParser.START_TAG)
    {
        if (xpp.getName().equalsIgnoreCase("item"))
        {
            listObject = new MyClass();
        }
        else if (xpp.getName().equalsIgnoreCase("yy"))
        {
            listObject.setYY(parser.nextText());
        }
        else if (xpp.getName().equalsIgnoreCase("zz"))
        {
            listObject.setZZ(parser.nextText());
        }
    }
    else if(xpp.getEventType() == XmlPullParser.END_TAG)
    {
        listObject = null;
    }
    xpp.next();
}

【讨论】:

  • 嗯,你在这里到底做了什么?看来你去掉了命名空间意识并更好地处理了这个缺陷。
猜你喜欢
  • 2013-09-30
  • 2011-11-12
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2011-08-09
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多