`
384444165
  • 浏览: 258862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XmlPullParser.nextText() bug 好文章,使用pull解析xml注意

 
阅读更多

请注意Android中的 XmlPullParser.nextText()

使用XmlPullParser 在Android上来解析XML文件是高效可维护的。由于历史原因,Android系统上有两种实现:

Xml.newPullParser()的实现有个bug,当调用函数 nextText() 后并不一定像文档描述的那样总是前进到END_TAG。一些程序可能使用再次调用next() 或者 nextTag()函数来解决这个问题。 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void parseXml(Reader reader)
        throws XmlPullParserException, IOException {
    XmlPullParser parser = Xml.newPullParser();
    parser.setInput(reader);
 
    parser.nextTag();
    parser.require(XmlPullParser.START_TAG, null, "menu");
    while (parser.nextTag() == XmlPullParser.START_TAG) {
        parser.require(XmlPullParser.START_TAG, null, "item");
        String itemText = parser.nextText();
        parser.nextTag(); // this call shouldn’t be necessary!
        parser.require(XmlPullParser.END_TAG, null, "item");
        System.out.println("menu option: " + itemText);
    }
    parser.require(XmlPullParser.END_TAG, null, "menu");
}
 
public static void main(String[] args) throws Exception {
    new Menu().parseXml(new StringReader("<?xml version='1.0'?>"
            + "<menu>"
            + "  <item>Waffles</item>"
            + "  <item>Coffee</item>"
            + "</menu>"));
}

在冰激凌三明治(Android 4.0)版本中,Android团队修改了Xml.newPullParser()函数的实现,返回KxmlParser 并且删除了ExpatPullParser 类。这样修复了nextTag() bug。不幸的是那些按照上面的代码修改该bug的程序在4.0系统上运行将会崩溃。

1
2
3
4
org.xmlpull.v1.XmlPullParserException: expected: END_TAG {null}item (position:START_TAG <item>@1:37 in java.io.StringReader@40442fa8)
     at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
     at com.publicobject.waffles.Menu.parseXml(Menu.java:25)
 at com.publicobject.waffles.Menu.main(Menu.java:32)

可以按照如下的方式来修复该问题,调用函数nextText()后只有当前位置不是END_TAG 的时候才调用nextTag()。

1
2
3
4
5
6
7
8
9
while (parser.nextTag() == XmlPullParser.START_TAG) {
    parser.require(XmlPullParser.START_TAG, null, "item");
    String itemText = parser.nextText();
    if (parser.getEventType() != XmlPullParser.END_TAG) {
        parser.nextTag();
    }
    parser.require(XmlPullParser.END_TAG, null, "item");
    System.out.println("menu option: " + itemText);
}

上面的代码在所有的Android版本上都能正常运行。如果您的程序使用了nextText()函数,请使用下面的助手函数来替代所有的nextText()函数调用:

1
2
3
4
5
6
7
8
private String safeNextText(XmlPullParser parser)
        throws XmlPullParserException, IOException {
    String result = parser.nextText();
    if (parser.getEventType() != XmlPullParser.END_TAG) {
        parser.nextTag();
    }
    return result;
}

现在只使用一个 XmlPullParser 实现,可以让维护系统更简单并且可以让Android开发团队集中精力在提高系统性能上面。



原文转载自 云在千峰: http://yunfeng.sinaapp.com/?p=278#ixzz1uRWXn2Qi
分享到:
评论

相关推荐

    使用Pull解析xml文件

    本篇文章将详细探讨PULL解析器,它是Android平台特有的一种轻量级、事件驱动的XML解析方法。 1. **PULL解析器介绍** PULL解析器是Android SDK中内置的一种解析XML的机制,特别适合于资源有限的移动设备。它通过...

    使用Pull解析器读取XML文件和生成XML文件

    本篇文章将深入探讨如何使用Pull解析器来读取XML文件,以及如何生成XML文件。Pull解析器是一种轻量级的解析方式,它允许程序在解析XML时按需获取数据,而不需要一次性加载整个文档到内存,从而提高了效率和资源利用...

    使用Android自带的XML解析器PULL解析器简单的解析xml

    Android系统提供了一种轻量级的XML解析方式——PULL解析器(Pull Parser),它适用于处理大型XML文档,因为它不需要像DOM解析器那样一次性加载整个XML文档到内存中。PULL解析器通过事件驱动的方式,按需解析XML文档...

    android之Pull解析XML文件

    本文将深入探讨如何在Android中使用Pull解析器来处理XML文件,这是一种高效且节省资源的方式。 Pull解析器是Android提供的一个API,它允许应用程序通过事件驱动的方式解析XML文档。与SAX解析器类似,Pull解析器不...

    android中使用PULL解析XML

    本文将深入探讨如何在Android中使用PULL解析器(Pull Parser)来解析XML文档,这是一种轻量级且高效的解析方式。 **PULL解析器概述** PULL解析器(Pull Parsing)是一种事件驱动的解析模型,它不需要完整的XML文档...

    在android中使用pull解析xml文件

    本文将深入探讨如何在Android中使用Pull解析器解析XML文件。 一、XML Pull解析器简介 XML Pull解析器(XML Pull API)是一种基于事件驱动的解析模型,它不需预先加载整个XML文档,而是逐行读取,当遇到特定的XML...

    AndroidReadXmlByPull-使用Pull解析Xml文件.zip

    本教程将深入探讨如何使用Pull解析器(XmlPullParser)来读取XML文件,这是Android官方推荐的一种高效且内存占用低的XML解析方式。 XML(可扩展标记语言)是一种用于标记数据的语言,其结构清晰,易于人阅读和机器...

    Android ReadXmlByPull 使用Pull解析Xml文件.rar

    Pull解析器是一种事件驱动的解析模型,它不创建整个XML文档树,而是通过调用`next()`方法按需拉取下一个事件,如开始标签、结束标签、文本等。这种方式减少了内存占用,特别适合资源有限的移动设备。 要使用Pull...

    android xml pull解析示例

    XML(eXtensible Markup Language)是一种用于标记...通过以上内容,我们可以了解XML Pull解析的基本概念、工作原理以及如何在Android中使用它来解析XML文档。在实际开发中,熟练掌握这一技术对于处理XML数据至关重要。

    android SAX PULL 解析XML文件 代码 详解

    本文将深入探讨两种主要的XML解析技术:SAX(Simple API for XML)和PULL(Pull Parser)。这两种方法都有其独特的优点和适用场景,下面将详细解释它们的工作原理和在Android环境下的实现。 首先,SAX解析是一种...

    android使用pull解析xml

    本篇文章将重点讲解如何使用Android中的Pull解析器(XMLPullParser)来解析XML文件。 Pull解析器是一种事件驱动的解析方式,它不需要一次性加载整个XML文档到内存,而是逐行读取,遇到每个元素时触发相应的事件,如...

    Pull 解析xml

    "Pull解析XML"是Android系统中处理XML文档的一种高效方法,相较于DOM(Document Object Model)和SAX(Simple API for XML),Pull解析器在内存占用和性能上有显著优势,尤其适合于移动设备资源有限的环境。...

    xml PULL解析的一个小例子

    本DEMO主要展示了如何在Android项目中使用XML Pull解析技术。 XML Pull解析器的工作方式是基于事件驱动的,它会读取XML文档并触发相应的事件(如开始标签、结束标签等),开发者通过监听这些事件来解析XML内容。...

    android pull解析xml源码

    "Android pull解析xml源码"这个主题聚焦于使用Android的XML Pull解析器来理解和操作XML文档。Pull解析器是一种事件驱动的解析方法,与DOM(Document Object Model)和SAX(Simple API for XML)不同,它不需要将整个...

    pull解析xml文件

    "Pull解析XML文件"是一种轻量级的解析方式,尤其适合在内存有限的移动设备上使用。本教程将通过一个简单的示例介绍如何在Android中使用Pull解析器处理XML数据。 XML(eXtensible Markup Language)是一种标记语言,...

    Android解析xml(3)---Pull解析

    本篇文章将重点讨论如何在Android中使用Pull解析器(PullParser)来解析XML文件。Pull解析器是一种事件驱动的解析方式,它允许应用程序在解析过程中按需获取XML数据,而不是一次性加载整个文档到内存,这使得处理...

    XmlPullParser解析Xml文件解析demo

    XmlPullParser是Android系统提供的一种解析XML文件的API,它是一种基于事件驱动的解析方式,能够高效、节省资源地处理XML文档。在这个“XmlPullParser解析Xml文件解析demo”中,我们将探讨如何利用XmlPullParser来...

    android 安卓xml pull解析

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于Android开发中,用于存储配置、数据交换...通过实践`WZWXmlParse`项目,你可以更好地理解XML Pull解析的工作原理,并将其应用到自己的项目中。

Global site tag (gtag.js) - Google Analytics