Android App中使用Pull解析XML格式数据的使用示例
程序员文章站
2024-03-31 16:00:46
pull解析xml文件的方式与sax解析xml文件的方式大致相同,他们都是基于事件驱动的。所以,利用pull解析xml文件需要下面几个步骤:
&n...
pull解析xml文件的方式与sax解析xml文件的方式大致相同,他们都是基于事件驱动的。所以,利用pull解析xml文件需要下面几个步骤:
1)通过xmlpullparserfactory获取xmlpullparser对象。
2)通过xmlpullparser对象设置输入流。
3)通过parser.next(),持续的解析xml文件直到文件的尾部。
下面的几个方法是经常需要的:xmlpullparserfacotry.newinstance( ) facotry.newpullparser( ) parser.setinput( ) parser.next( ).
下面通过一个例子描述上面的几个步骤:
//1.第一步,创建解析工厂 xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); //设置支持命名空间 factory.setnamespaceaware(true); //2.生成parser对象 xmlpullparser parser = factory.newpullparser(); //3.设置输入 parser.setinput(new stringreader("<?xml version=\"1.0\" ?><poem><title>静夜思</title><author>李白</author><content>床前明月光,疑似地上霜,举头忘明月,低头思故乡</content></poem>")); //获取输入类型 int eventtype = parser.geteventtype(); while (eventtype != xmlpullparser.end_document) { if (eventtype == xmlpullparser.start_document) { log.d("tag", "----"+parser.getname()); } if (eventtype == xmlpullparser.start_tag) { log.d("tag", "----"+parser.getname()); } if (eventtype == xmlpullparser.text) { log.d("tag", "----"+parser.gettext()); } if (eventtype == xmlpullparser.end_tag) { log.d("tag", "----"+parser.getname()); } //不断的去更新 eventtype = parser.next(); }
打印出的对象:
pull在android 集成了这种解析,性能和sax差不多,个人认为用来来比sax解析容易多了;采用事件驱动进行解析。
dom(document object model)文档对象模型:是w3c组织推荐的解析xml的一种方式;一般只能只能解析比较小的xml文件;因为dom解析是把整个xml放入内存,占用内存比较大,但对文档的
增删改查标胶容易操作。
sax(simple api for xml)不是官方的标准,但它是xml社区事实上的标准,几乎所有的xml解析器都支持它。sax解析一般适合xml的读取,sax解析是从上往下读取,一行一行来读。
来看一个完整的实例:
package com.android.xiong.documentpullxml; import java.io.ioexception; import java.io.inputstream; import java.net.httpurlconnection; import java.net.url; import java.util.linkedhashmap; import org.xmlpull.v1.xmlpullparser; import org.xmlpull.v1.xmlpullparserexception; import org.xmlpull.v1.xmlpullparserfactory; import android.app.activity; import android.app.progressdialog; import android.content.dialoginterface; import android.os.asynctask; import android.os.bundle; import android.view.menu; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.textview; public class mainactivity extends activity { textview showtxt; button btshow; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); showtxt = (textview) findviewbyid(r.id.showtxt); btshow = (button) findviewbyid(r.id.showxml); btshow.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { getbaiduxmlbooks baiduxml=new getbaiduxmlbooks(); baiduxml.execute("http://bcs.duapp.com/meinvlook/books.xml"); } }); } // 异步任务 class getbaiduxmlbooks extends asynctask<string, integer, linkedhashmap<string, string>> { progressdialog progress; // 初始化progressdialog @override protected void onpreexecute() { progress = new progressdialog(mainactivity.this); progress.settitle("提示!"); progress.setmessage("正在解析百度云存储的xml"); progress.setcanceledontouchoutside(false); progress.setbutton(progressdialog.button_neutral, "取消", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { // 取消任务 getbaiduxmlbooks.this.cancel(true); progress.dismiss(); } }); progress.show(); } // 进行耗时操作 @override protected linkedhashmap<string, string> doinbackground(string... params) { string xmurl = params[0]; linkedhashmap<string, string> map = new linkedhashmap<string, string>(); url url; try { url = new url(xmurl); httpurlconnection connection = (httpurlconnection) url .openconnection(); connection.setconnecttimeout(10000); connection.setrequestmethod("get"); inputstream instream = connection.getinputstream(); // 获取xml解析器 xmlpullparser parser = xmlpullparserfactory.newinstance() .newpullparser(); parser.setinput(instream, "utf-8"); int type=parser.geteventtype(); //开始解析xml文件 while (type!= xmlpullparser.end_document) { if (type == xmlpullparser.start_tag) { // 获取开始标签 if (parser.getname().equals("书名")) { //获取节点的值 map.put("书名", parser.nexttext()); } if (parser.getname().equals("价格")) { map.put("价格", parser.nexttext()); } if (parser.getname().equals("作者")) { map.put("作者", parser.nexttext()); } if (parser.getname().equals("性别")) { map.put("性别", parser.nexttext()); } if (parser.getname().equals("年龄")) { map.put("年龄",parser.nexttext()); } } type=parser.next(); } } catch (ioexception e) { e.printstacktrace(); } catch (xmlpullparserexception e) { e.printstacktrace(); } return map; } @override protected void onpostexecute(linkedhashmap<string, string> result) { for (string txt : result.keyset()) { showtxt.append(txt+":"+result.get(txt)+"\n"); } progress.dismiss(); } } @override public boolean oncreateoptionsmenu(menu menu) { // inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } }
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity" > <button android:id="@+id/showxml" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btshowxml"/> <textview android:id="@+id/showtxt" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </linearlayout> <!-- 获取网络权限 --> <uses-permission android:name="android.permission.internet"/>
推荐阅读
-
Android App中使用Pull解析XML格式数据的使用示例
-
Android App中使用Pull解析XML格式数据的使用示例
-
实例解析Android中使用Pull解析器解析XML的方法
-
Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
-
Java的微信开发中使用XML格式和JSON格式数据的示例
-
Java的微信开发中使用XML格式和JSON格式数据的示例
-
Android App中各种数据保存方式的使用实例总结
-
实例解析Android中使用Pull解析器解析XML的方法
-
Android应用中使用DOM方式解析XML格式数据的基本方法
-
Android App中各种数据保存方式的使用实例总结