android 解析XML方式(一)
在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据呢?
通常有三种方式:DOM,SAX,PULL
在这一节中我们使用DOM方式来处理。
DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC机器比,因此在处理效率方面就相对差了,当然这是对于其他方式处理xml文档而言。
解析xml文档,当然必须有xml文档文件啦,我自己胡乱弄了一个river,放在assets目录.如下:
- <?xml version="1.0" encoding="utf-8"?>
- <rivers>
- <river name="灵渠" length="605">
- <introduction>
- 灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。
- </introduction>
- <imageurl>
- http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
- </imageurl>
- </river>
- <river name="胶莱运河" length="200">
- <introduction>
- 胶莱运河南起黄海灵山海口,北抵渤海三山岛,流经现胶南、胶州、平度、高密、昌邑和莱州等,全长200公里,流域面积达5400平方公里,南北贯穿山东半岛,沟通黄渤两海。胶莱运河自平度姚家村东的分水岭南北分流。南流由麻湾口入胶州湾,为南胶莱河,长30公里。北流由海仓口入莱州湾,为北胶莱河,长100余公里。
- </introduction>
- <imageurl>
- http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
- </imageurl>
- </river>
- <river name="苏北灌溉总渠" length="168">
- <introduction>
- 位于淮河下游江苏省北部,西起洪泽湖边的高良涧,流经洪泽,青浦、淮安,阜宁、射阳,滨海等六县(区),东至扁担港口入海的大型人工河道。全长168km。
- </introduction>
- <imageurl>
- http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
- </imageurl>
- </river>
- </rivers>
那么如何处理呢?
具体思路是:
*首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例
*然后利用DocumentBuilderFactory创建DocumentBuilder
*然后加载XML文档(Document),
* 然后获取文档的根结点(Element),
* 然后获取根结点中所有子节点的列表(NodeList),
* 然后使用再获取子节点列表中的需要读取的结点。
当然我们观察节点,我需要用一个River对象来保存数据,抽象出River类
- public class River implements Serializable {
- private static final long serialVersionUID = 1L;
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getLength() {
- return length;
- }
- public void setLength(int length) {
- this.length = length;
- }
- public String getIntroduction() {
- return introduction;
- }
- public void setIntroduction(String introduction) {
- this.introduction = introduction;
- }
- public String getImageurl() {
- return imageurl;
- }
- public void setImageurl(String imageurl) {
- this.imageurl = imageurl;
- }
- private int length;
- private String introduction;
- private String imageurl;
- }
下面我们就开始读取xml文档对象,并添加进List中:代码如下:
我们这里是使用assets中的river.xml文件,那么就需要读取这个xml文件,返回输入流。
读取方法为:inputStream=this.context.getResources().getAssets().open(fileName); 参数是xml文件路径,当然默认的是assets目录为根目录。
然后可以用DocumentBuilder对象的parse方法解析输入流,并返回document对象,然后再遍历doument对象的节点属性。
- //获取全部河流数据
- /**
- * 参数fileName:为xml文档路径
- */
- public List<River> getRiversFromXml(String fileName){
- List<River> rivers=new ArrayList<River>();
- DocumentBuilderFactory factory=null;
- DocumentBuilder builder=null;
- Document document=null;
- InputStream inputStream=null;
- //首先找到xml文件
- factory=DocumentBuilderFactory.newInstance();
- try {
- //找到xml,并加载文档
- builder=factory.newDocumentBuilder();
- inputStream=this.context.getResources().getAssets().open(fileName);
- document=builder.parse(inputStream);
- //找到根Element
- Element root=document.getDocumentElement();
- NodeList nodes=root.getElementsByTagName(RIVER);
- //遍历根节点所有子节点,rivers 下所有river
- River river=null;
- for(int i=0;i<nodes.getLength();i++){
- river=new River();
- //获取river元素节点
- Element riverElement=(Element)(nodes.item(i));
- //获取river中name属性值
- river.setName(riverElement.getAttribute(NAME));
- river.setLength(Integer.parseInt(riverElement.getAttribute(LENGTH)));
- //获取river下introduction标签
- Element introduction=(Element)riverElement.getElementsByTagName(INTRODUCTION).item(0);
- river.setIntroduction(introduction.getFirstChild().getNodeValue());
- Element imageUrl=(Element)riverElement.getElementsByTagName(IMAGEURL).item(0);
- river.setImageurl(imageUrl.getFirstChild().getNodeValue());
- rivers.add(river);
- }
- }catch (IOException e){
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- }
- catch (ParserConfigurationException e) {
- e.printStackTrace();
- }finally{
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return rivers;
- }
在这里添加到List中, 然后我们使用ListView将他们显示出来。如图所示:
android 解析XML方式(一)的更多相关文章
- android 解析XML方式(三)
上一节中,我们使用SAX方式解析xml文档, SAX方式是基于事件驱动的.当然android的事件机制是基于回调函数的.在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SA ...
- android 解析XML方式(二)
上一节中,我们使用DOM方式解析xml文档,该方式比较符合我们日常思维方式,容易上手,但是它直接把文档调入内存中,比较耗内存.在这里我们可以用另外一种方式解析xml,这个就是SAX方式. SAX即是: ...
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...
- android解析xml文件的方式
android解析xml文件的方式 作者:东子哥 ,发布于2012-11-26,来源:博客园 在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...
- Android解析XML(PULL方式)
PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...
- Android几种解析XML方式的比较
https://blog.csdn.net/isee361820238/article/details/52371342 一.使用SAX解析XML SAX(Simple API for XML) 使用 ...
- Android 解析XML—pull解析方式
在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,其中PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部 ...
- Android解析XML
在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...
- Android解析xml文件-采用DOM,PULL,SAX三种方法解析
解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...
随机推荐
- UI2_视图切换
// // ViewController.m // UI2_视图切换 // // Created by zhangxueming on 15/7/1. // Copyright (c) 2015年 z ...
- ListView Web 服务器控件概述(MSDN)
1: "折叠"图像"展开"图像"复制"图像"复制悬停"图像 全部折叠全部展开 代码:全部 代码:多个 代码:Visual ...
- UML类图新手入门级介绍
UML类图新手入门级介绍 举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法. 首先,看动物矩形框,它代表一个类(Class).类图分三层,第一层显示类的名称,如果是抽象类,则就用 ...
- 麦子学院Android开发Java教程ClassCastException 错误解析
现在Java编程中经常碰到ClassCastException 错误,ClassCastException 是 JVM 在检测到两个类型间的转换不兼容时引发的运行时异常.此类错误通常会终止用户请求.本 ...
- win8.1环境下硬盘安装centos6.5双系统
作为一名软件工程师或是相关行业的从业人员,经常会用到linux系统,这里为大家介绍的安装linux的方案是在原有win环境下安装linux双系统,两个系统选择分别为win8.1 和centos6.5. ...
- 如何在CentOS5中增加CentALT的源
1. 建立centalt.repo 指令: vi /etc/yum.repos.d/centalt.repo 2. 將下面的內容貼進去 [CentALT] name=CentALT ...
- 基础学习总结(六)--getContentRolver()的应用、内容监听者ContentObserver
ContentResolver / getContentResolver() 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当 ...
- SQLServer数据库表中将指定列分组转一行
不说明,直接看代码: --1. 创建表,添加测试数据 CREATE TABLE #test(code varchar(50), [values] varchar(10)) INSERT #test S ...
- Java对象校验框架之Oval
只要有接口,就会有参数的校验,目前开源的校验框架已经非常多了,不过不得不提一下Oval.OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件.Annotation.POJO ...
- Spark菜鸟学习营Day6 分布式代码运行调试
Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...