在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法 。Android已经在历史上有两个实现这个接口实现类:

  • KXmlParser,通过XmlPullParserFactory.newPullParser() 。

  • ExpatPullParser,通过Xml.newPullParser() 。

实现Xml.newPullParser()调用nextText()有个错误,nextText()并不总是向文档中所提到优先于END_TAG执行 。

因此,一些应用可能会出现bug在额外调用next()或nextTag();

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

在android4.0中,改变了Xml.newPullParser()返回KxmlParser类,同时删除了ExpatPullParser类。这样就修正了nextTag()的bug.

不幸的是,当前可能会崩溃的应用程序都是低于android4.0版本的,下面是错误信息。

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()之后再跳用nextTag(),仅当当前的位置不是END_TAG。

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

上面的代码可以正确解析所有xml版本,如果应用程序广范的使用了nextText(),那就在使用nextText()的地方用下面的辅助方法。

private String safeNextText(XmlPullParser parser)  
         throws XmlPullParserException, IOException {  
     String result = parser.nextText();  
     if (parser.getEventType() != XmlPullParser.END_TAG) {  
         parser.nextTag();  
     }  
     return result;  
 }

使用单一的XmlPullParse简化了我们的维护,同时可以让我们有更多的精力花费在调高系统的性能。

以上就是 小心XmlPullParser.netText()方法的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

  • 相关标签:XmlPullParser.netText()
  • 程序员必备接口测试调试工具:点击使用

    Apipost = Postman + Swagger + Mock + Jmeter

    Api设计、调试、文档、自动化测试工具

    网页生成APP,用做网站的技术去做APP:立即创建

    手机网站开发APP、自助封装APP、200+原生模块、2000+映射JS接口按需打包

    • 上一篇: android XPath 解析xml
    • 下一篇: android pull 创建xml文件

    相关文章

    相关视频


    • 使用xmlhttp为网站增加域名查询功能的示例代码...
    • 四种XML解析方式详解
    • 基于PHP对XML的操作详解
    • XML和Tomcat的入门知识的详细介绍
    • 小心XmlPullParser.netText(...
    • Vue3 事件修饰符
    • vue3 指令
    • vue3 基础语法
    • vue3 组合api和选项api介绍

    视频教程分类

    • php视频教程
    • html视频教程
    • css视频教程
    • JS视频教程
    • jQuery视频教程
    • mysql视频教程
    • Linux视频教程
    • Python视频教程
    • Laravel视频教程
    • Vue视频教程

    专题

     小心XmlPullParser.netText()方法