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;米格粉们千万不要看这架飞机&…

内容营销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

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

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

容错性设计

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

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 的具体操作方…

百度epoll

epoll编辑epoll是Linux内核为处理大批量句柄而作了改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。目 录 1简介 2优点 2.1 支持一个进程打开大数目的socket描述符2.2 …

linux命令 正则表达式,详解Linux命令中的正则表达式

详解Linux命令中的正则表达式Mark Do 2017年9月19日 暂无评论 阅读 981 次命令中的正则表达式如果要在命令输出或文本中筛选内容时使用模糊查找&#xff0c;就需要使用正则表达式。正则表达式是一套由多个元字符组成的模糊查找模式&#xff0c;使用正则表达式可以快速查找和定位…

【转】符串搜索工具及XenoCode字符串自动解密工具

【http://www.cnblogs.com/chengchen/archive/2008/07/14/1242244.html】 我们在使用OD破解软件的时候&#xff0c;字符串搜索是最常用的功能之一。但是在DONET平台下似乎没有什么比较好的软件&#xff0c;于是自己动手写了一个软件。这个软件可以自动搜索DONET程序集中的所有的…

linux 封装python,基于linux下python学习(封装)

一、面向对象类的设计&#xff1a;在程序开发中&#xff0c;要设计一个类&#xff0c;通常需要满足以下三个要求&#xff1a;1、类名 这类事物的名字&#xff0c;满足大驼峰命名法2、属性 这类事物具有什么样的特征3、 方法 这类事物具有什么样的行为eg:小明今年18岁&#xf…

图解RAID 0, RAID 1, RAID 5, RAID 10

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

Spring JPA 中的Repository体系

为什么80%的码农都做不了架构师&#xff1f;>>> Repository体系 org.springframework.data.repository.Repository<T, ID> ---- Repository体系的顶级接口,是个空接口 interface CrudRepository<T, ID extends Serializable> extends Repository<T,…

Codeforces 258B Little Elephant and Elections

题意&#xff1a;有7个人从m个数中任选一个不重复的&#xff0c;其中4和7是幸运数&#xff0c;一个人的幸运值等于他所选的数字中所有4的个数7的个数。求一个人的幸运值比其他6人幸运值总和大的方案数。 1 #include <iostream>2 #define MOD 10000000073 using namespace…

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

装 linux后 win7消失了,win7系统重装后ubuntu启动消失不见的解决方法

很多小伙伴都遇到过win7系统重装后ubuntu启动消失不见的困惑吧&#xff0c;一些朋友看过网上零散的win7系统重装后ubuntu启动消失不见的处理方法&#xff0c;并没有完完全全明白win7系统重装后ubuntu启动消失不见是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xf…

linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码

Apache虚拟主机的配置和泛域名解析实现代码更新时间&#xff1a;2012年03月11日 00:28:19 作者&#xff1a;Apache虚拟主机的配置和泛域名解析实现代码&#xff0c;需要的朋友可以参考下虚拟主机的配置基于IP地址的虚拟主机配置Listen 80DocumentRoot /www/jb51ServerName ww…

socket用法linux,linux socket编程,要用到哪些函数,和用法介绍?_Linux_天涯问答_天涯社区...

4、获得地址信息/* 来源: http://www.jfox.info/c/a/ic/18071a.html */#include #include /* for strncpy */#include #include #include #include #include intmain(){int fd;struct ifreq ifr;fd socket(AF_INET, SOCK_DGRAM, 0);/* I want to get an IPv4 IP address */if…

图灵访谈系列之一:陈世欣谈产品经理与社区

原文链接地址&#xff1a;点击打开链接 10月20日&#xff0c;产品经理社区PMCamp、极客社区TopGeek的发起者和组织者陈世欣先生来图灵做客&#xff0c;畅谈对产品经理成长和社区发展的看法。以下为图灵社区整理的相关谈话内容。 人物简介&#xff1a; 陈世欣 StingChen产品经理…

Jenkins 使用 maven 出现C:\Windows\system32\config\systemprofile的解决

jenkins 使用 maven 出现 C:\Windows\system32\config\systemprofile 的原因是 Jenkins 服务启动的账号使用了系统的账号&#xff0c;在服务里改成具体的桌面用户账号即可。 If your command runs fine on Win command prompt as user X, then you should run Jenkins with the…