android-XML解析Dom,Sax,Pull

android平台上解析xml的常见的工具有三种:dom,sax,pull。
第一种是DOM,
它的特点是一次全部加载,如果对于数据量小的情况下,它的效率还可以,如果XML文件很大的情况下,速度就会慢起来。
第二种方式SAX:
SAX是基于事件驱动的。当然android的事件机制是基于回调函数的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。
第三种方式PULL:
这种方式也是基于事件驱动 的,与SAX方式一样,只不过PULL方式读xml回调方法返回的是数字。
下面分别使用它们解析xml文件。
在assert下放置persons.xml文件:

<?xml version="1.0" encoding="utf-8"?> <persons> <person id="1"> <name>张三</name> <age>12</age> </person> <person id="2"> <name>李四</name> <age>14</age> </person> <person id="3"> <name>王五</name> <age>15</age> </person> </persons>
创建Activity文件准备处理文件并显示:

import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.res.AssetManager; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleAdapter; public class XMLActivity extends Activity implements OnClickListener{ /** Called when the activity is first created. */ private Button btn_dom; private Button btn_sax; private Button btn_pull; private ListView listview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init(){ btn_dom=(Button) findViewById(R.id.dom); btn_sax=(Button) findViewById(R.id.sax); btn_pull =(Button) findViewById(R.id.pull); listview =(ListView) findViewById(R.id.list); btn_dom.setOnClickListener(this); btn_sax.setOnClickListener(this); btn_pull.setOnClickListener(this); } public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); List<Person> list = null; InputStream is = null; AssetManager manager = getAssets(); try { //读取xml文件。 is = manager.open("persons.xml"); } catch (IOException e) { e.printStackTrace(); } switch (id) { case R.id.dom: //使用dom解析 try { list = new DomParseService().getPersonsByParseXml(is); showUI(list); } catch (Exception e) { e.printStackTrace(); } break; case R.id.sax: //使用sax解析 try { list = new SAXParseService().getPersonsByParseXml(is); showUI(list); } catch (Exception e) { e.printStackTrace(); } break; case R.id.pull: //使用pull解析 try { list = new PullParseService().getPersonsByParseXml(is); showUI(list); } catch (Exception e) { e.printStackTrace(); } break; default: break; } try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void showUI(List<Person> list) { List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); for (Person p : list) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", p.getId()); map.put("name", p.getName()); map.put("age", p.getAge()); data.add(map); } String[] from = { "id", "name", "age" }; int[] to = { R.id.tv_id, R.id.tv_name, R.id.tv_age }; SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.person_list_item, from, to); listview.setAdapter(adapter); } }

创建解析xml文件的接口:

import java.io.InputStream; import java.util.List; public interface IXmlParseService { public List<Person> getPersonsByParseXml(InputStream is) throws Exception; }

dom解析:

import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import android.util.Log; public class DomParseService implements IXmlParseService { public List<Person> getPersonsByParseXml(InputStream is) throws Exception { // TODO Auto-generated method stub List<Person> list = null; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder build =factory.newDocumentBuilder(); Document document = build.parse(is); Element rootElement = document.getDocumentElement(); NodeList nodeList = rootElement.getElementsByTagName("person"); if(nodeList==null||nodeList.getLength()==0) { return null; } list = new ArrayList<Person>(); for(int i=0;i<nodeList.getLength();i++) { Person person = new Person(); Element element = (Element) nodeList.item(i); // 得到根节点属性:id int id = Integer.parseInt(element.getAttribute("id")); person.setId(id); /*得到子节点*/ NodeList childnodes = element.getChildNodes(); for(int j=0; j<childnodes.getLength(); j++ ){ Node childNode = (Node)childnodes.item(j); if(childNode.getNodeType() == Node.ELEMENT_NODE){ Element childElement = (Element)childNode; if("name".equals(childElement.getNodeName())){ person.setName(childElement.getFirstChild().getNodeValue()); } else if("age".equals(childElement.getNodeName())){ person.setAge(new Short(childElement.getFirstChild().getNodeValue())); } } } list.add(person); } return list; } }
sax解析:

import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.os.Handler; import android.util.Log; public class SAXParseService implements IXmlParseService { public List<Person> getPersonsByParseXml(InputStream is) throws Exception { // TODO Auto-generated method stub SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser =factory.newSAXParser(); MyHandler handler = new MyHandler(); parser.parse(is,handler); return handler.getList(); } private class MyHandler extends DefaultHandler { private List<Person> list; private Person person; private String currentTag; private List<Person> getList() { return list; } @Override public void startDocument() throws SAXException { list = new ArrayList<Person>(); } @Override public void endDocument() throws SAXException { super.endDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("person".equals(qName)) { person =new Person(); person.setId(Integer.parseInt(attributes.getValue("id"))); }else if("name".equals(qName)||"age".equals(qName)){ currentTag =qName; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String s =new String(ch,start,length); if("name".equals(currentTag)) { person.setName(s); }else if("age".equals(currentTag)) { person.setAge(Integer.parseInt(s)); } currentTag =null; } @Override public void endElement(String uri, String localName, String qName) { if("person".equals(qName)) { list.add(person); person = null; } } } }
pull解析:

import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; public class PullParseService implements IXmlParseService { public List<Person> getPersonsByParseXml(InputStream is) throws Exception { // TODO Auto-generated method stub List<Person> persons=null; Person person=null; XmlPullParser parser=Xml.newPullParser(); parser.setInput(is, "UTF-8"); int event=parser.getEventType(); while(event!= XmlPullParser.END_DOCUMENT){ switch(event){ case XmlPullParser.START_DOCUMENT: persons=new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if("person".equals(parser.getName())){ Integer personId=new Integer(parser.getAttributeValue(0)); person=new Person(); person.setId(personId); }else if("name".equals(parser.getName())){ String personName=parser.nextText(); person.setName(personName); }else if("age".equals(parser.getName())) person.setAge(new Short(parser.nextText())); break; case XmlPullParser.END_TAG: if("person".equals(parser.getName())){ persons.add(person); person=null; } break; } event=parser.next(); } return persons; } }

运行效果如下:



转载于:https://www.cnblogs.com/android-html5/archive/2011/11/26/2534097.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

射击的乐趣:WIN32诠释打飞机游戏

一楼留给链接http://blog.csdn.net/crocodile__/article/details/11860129 楼上神贴&#xff0c;膜拜片刻...... 一、游戏玩法和已经实现的功能 1.打开游戏会有提示是否开始游戏。 2.键盘↑↓←→控制保卫者飞机&#xff08;米格21原型&#xff0c;米格粉们千万不要看这架飞机&…

硬盘安装Linux救援系统,硬盘安装linux系统

这里推荐大家使用Daemon Tool 这个Windows下的软件将ISO文件“解”到硬盘上。比方说shrike-i386-disc1.iso可以解压缩到C:盘的cd1目录&#xff0c;shrike-i386-disc2.iso解压缩到C:盘的cd2目录&#xff0c;shrike-i386-disc3.iso可以解压缩到C:盘的cd3目录待用。把cd1&#xff…

内容营销11金规

内容营销11金规 现在也许是解释和讲述一个很重要观点的好时机&#xff1a;创造给力的内容十分关键&#xff0c;但还不够。你还必须提出满足大量其他目标的材料&#xff0c;而这些材料&#xff0c;符合给力的内容的惯例&#xff0c;或者&#xff08;你知道我们马上谈论这一点&am…

eclipse3.4 SVN插件安装

2019独角兽企业重金招聘Python工程师标准>>> SVN插件: http://subclipse.tigris.org/update_1.6.x 汉化版&#xff0c;现在我这边eclipse3.4是可用的。 转载于:https://my.oschina.net/dreamnight/blog/695060

工作那些事(十六)面试时,面试官喜欢的非技术问题汇总

在找工作的过程中&#xff0c;进行技术和人事面试时不可避免的。有的人笔试答的挺好&#xff0c;挂在了面试的时候&#xff0c;确实很可惜的。一般来说&#xff0c;技术性的岗位是笔试&#xff08;有的还有性格测试题&#xff09;、技术面试、人事面试。这里汇总一下面试时&…

连接两个linux系统软件,【技术共享】synergy-两台电脑共享一套鼠标键盘-Linuxwindows...

PS:这软件倒是不错,可是这要求两台电脑显示器都可以看到.当然一般我们是用不到的.再加上是局域网,直接用远程桌面连接或者控制软件也可以的.前些天&#xff0c;我把自己的台式电脑搬到实验室&#xff0c;与实验室里分配给我的电脑一起用。为了方便使用&#xff0c;我尝试了下用…

删除android系统自带的第三方软件

一般手机买来的时候都捆绑了第三方软件&#xff0c;并不是我们所需要的&#xff0c;那我们就删除它们&#xff0c;我们也有选择的权利。 第一步&#xff1a;原理。android捆绑的软件基本安装在/system/app文件下&#xff0c;删除下面的对应的了第三方软件APK文件即可完美卸载 如…

struts2 中文件的位置问题

开发情况下&#xff0c;js文件&#xff0c;模板文件等不是很重要的文件一般放在WebRoot根目录下&#xff0c; 这种情况下的模板文件中添加 css或者js 文件时是相对文件自身添加的&#xff0c;必要时可以通过..来返回到WebRoot根目录&#xff0c;例如&#xff1a; WebRoot目录下…

linux cgoup内存限制,Linux Cgroup系列(05):限制cgroup的CPU使用(subsystem之cpu)

在cgroup里面&#xff0c;跟CPU相关的子系统有cpusets、cpuacct和cpu。其中cpuset主要用于设置CPU的亲和性&#xff0c;可以限制cgroup中的进程只能在指定的CPU上运行&#xff0c;或者不能在指定的CPU上运行&#xff0c;同时cpuset还能设置内存的亲和性。设置亲和性一般只在比较…

Hive的安装和配置

在hadoop帐户下一、下载hive-0.8.1.tar.gzwget mirrors.cnnic.cn/apache/hive/stable/hive-0.11.0.tar.gz二、解压到/opt/modules目录下tar -zxvf hive-0.11.0.tar.gzcd hive-0.11.0三、配置Hive的环境变量&#xff08;该步在root帐户下&#xff09;vi /etc/profile.d/java.she…

容错性设计

即便你的产品90&#xff05;的时间都运行良好。但是如果在用户需要帮助时置之不理&#xff0c;他们是不会忘记这一点的。——《getting real》 我们有时候不能不面对产品出错的时候。无论设计得多么用心&#xff0c;无论做了多少测试&#xff0c;用户仍然会遇到错误和问题。既然…

19:A*B问题

总时间限制: 1000ms内存限制: 65536kB描述输入两个正整数A和B&#xff0c;求A*B。 输入一行&#xff0c;包含两个正整数A和B&#xff0c;中间用单个空格隔开。1 < A,B < 50000。输出一个整数&#xff0c;即A*B的值。样例输入3 4 样例输出12错误代码&#xff1a; #include…

hdu2057

hdu2057 #include <stdio.h> int main(){__int64 a,b,t;while(~scanf("%I64X%I64X",&a,&b)){if(ab<0) {printf("-%I64X\n",-(ab));}else{printf("%I64X\n",ab);}}return 0; } posted on 2013-11-02 13:41 symons 阅读(...) 评论…

linux静态路由添加自启动,LINUX添加静态路由

LINUX添加静态路由建议&#xff0c;先用命令添加&#xff0c;测试生效未有其他影响后&#xff0c;添加到配置文件中。以本次127前置添加静态路由为例用户需要添加路由如下&#xff0c;命令格式为windows添加格式。route -a -p10.113.70.0 mask255.255.255.010.113.65.44rout…

自省:我为什么没有成功--对照35前务必完成的12跳

第1跳:1个目标 一艘没有航行目标的船&#xff0c;任何方向的风都是逆风&#xff0c;请明确以下几点&#xff1a; 1.你为什么是穷人——很多时候是因为你没有立下成为富人的目标。 自省&#xff1a;我确实没有成为富人的目标&#xff0c;因为我只是有一些中彩票后的臆想 2.你的…

Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

通过【Spring Data 系列(一) 入门】的介绍&#xff0c;通过对比的方式认识到Spring提供的JdbcTemplate的强大功能。通过使用JdbcTemplate&#xff0c;操作数据库&#xff0c;不需要手动处理Connection,Statement等底层SQL对象。可是&#xff0c;Spring对数据库的操作还远远没有…

emmet-vim

最近啊&#xff0c;我投奔了网页的开发&#xff0c;看了一本《head first HTML and CSS》的书&#xff0c;感觉非常不错&#xff0c;然后又配置了一些vim里面用到的插件&#xff0c;现在我把学习到的东西记录下来&#xff01; 首先&#xff0c;我不会在这里写emmet 的具体操作方…

熟悉linux系统内核,[科普] Linux 的内核与 Linux 系统之间的关系

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在 FHS 协议里&#xff0c;有这样的规定&#xff1a;/bin/ 需要在单用户模式可用的必要命令(可执行文件)&#xff1b;面向所有用户&#xff0c;例如&#xff1a; cat、 ls、 cp。/boot/ 引导程序文件&#xff0c;例如&#xff1a; …

linq to xml 操作sitemap

刚开始用xml去做没有弄好&#xff0c;折腾了好久成功了&#xff0c;先仓促的记一下 protected void btnAdd_Click(object sender, EventArgs e) { XElement els XElement.Load(Server.MapPath("~\Student\stu.sitemap")); XNamespace siteNM &…

mysql-5.5.50-winx64

1 获取帮助文档cd C:\Program Files\mysql\mysql-5.5.50-winx64 C:\Program Files\mysql\mysql-5.5.50-winx64> bin\mysqld.exe --verbose --help > mysqld_note.txt2 在 Windows 平台以服务运行2.1 启动服务器需要安装&#xff0c;写个安装脚本“bin\mysqld.exe --insta…