二、Android XML数据解析
XML,可扩展标记语言。可以用来存储数据,可以看做是一个小型的数据库,SharedPreference
就是使用XML文件存储数据的,SQLite
底层也是一个XML文件,而在网络应用方面,通常作为信息的载体,通常把数据包装成XML来传递。
1 |
-----文档开始 |
上面就简单的定义了一个存储person对象的xml文件的编码,注意,外面的空白区域也是文本节点。
2. 三种解析XML方法的比较
2.1 SAX解析XML
对文档进行顺序扫描,当扫描到文档(doucument)开始与结束、元素(element)开始与结束等地方时,通知事件处理函数,由事件处理函数做相对应动作,然后继续进行同样的扫描,直至文档结束。解释速度快,占用内存小,,每需要解析一类XML,就需要编写新的适合该类的XML处理类,比较麻烦。采用的是流式解析,解析是同步的,读到哪就处理到哪。
2.2 Dom解析XML
先把XML文档读取到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存,假如读取的数据量大,手机内存不够的话,可能导致手机死机。不建议在Android设备中使用,解析简单的XML可以。常用的五个接口与类:Docculem
、Element
、Node
、NodeList
、DOMParser
,Don是整个文件解析到内存中,供用户需要的节点信息,支持随机访问。
2.3 pull解析XML
XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser
、nextText
从XML文档中提取所有字符数据。当解析到文档结束时,自动生成EndDocument
。常用接口和类:XmlPullParser
、XmlSerializer
、XmlPullParserFactory
。和SAX差不多,代码实现比较简单,非常适合移动设备,Android系统内置pull解析器,而且Android系统内部默认使用pull来解析XML文件。
3. SAX解析XML
SAX是一个解析速度快且占用内存少的XML解析器,非常适合用于Android等移动设备;SAX解析XML文件采用的是事件驱动,也就是说不需要解析整个文档,而是在解析过程中,判断读取的字符是否符合XML语法的某部分(文档开头,文档结束,或者标签开头和标签结束),符合的话就会触发事件(回调方法),而这些方法都定义在ContentHandler
接口中,而ContentHandler
是一个接口, 使用起来不方便,所以Android准备了一个帮助类DefaultHandler
,只需要继承这个类,重写里面对应的方法即可。
可以重写的方法:
startDocument()
:当读取到文文档开始标志时触发,通常在这里完成一些初始化操作。endDocument()
:文档结束部分,在这里完成一些善后工作。startElement(names, paceURI, localName, qName, atts)
:参数依次问命名空间,不带命名空间的前缀标签名,带命名空间的前缀标签名,通过atts
可以得到所有的属性名和相应的值;SAX中一个重要的特点就是它的流式处理,当遇到一个标签时,它并不会记录下以前遇到的标签,就是说,在startElement()
中,所有知道的信息就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素等其他与结构相关的信息,都不知道,需要程序来完成,这使得SAX在编程处理上没有DOM方便。endElement(uri, localName, name)
:在遇到结束标签的时候,调用该方法。characters(ch, start, length)
:这个方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch, start, length)
就可以获取内容。
核心代码:SAX解析类——SaxHelper.java
1 |
package com.ly.allendemowebservice; import android.util.Log; import org.xml.sax.Attributes; |
1 |
private ArrayList<Person> readXmlForSax() throws IOException, ParserConfigurationException, SAXException { |
在项目assets目录下有一个文件person1.xml
。
1 |
<persons> |
Demo地址:Allen_Demo_WebService
4. DOM解析XML数据
DOM解析XML文件时会将文件所有的内容以文档树的形式存放在内存中,可以使用DOM API遍历XML树,检索到需要的数据。使用DOM操作XML的代码比较直观,并且在编码方面比基于SAX的实现更加简单。但是DOM需要将XML文件的所有内容存放到内存中,所以内存消耗大,特别是对于Android设备而言,内存资源有限,因此建议使用前面的SAX解析。如果解析的内容比较小,也可以使用DOM来解析。
DOM API:
DocumentBuilderFactory
(解析器工厂类):创建方法DoucmentBuilderFactory factory = DoucmentBuilderFactory.newInstance();
DocumentBuilder
(解析器类):创建方法:通过解析器工厂类来获得DocumentBuidler builder = factory.newDocumentBuilder();
Document
(文档树模型):将需要解析的XML文件读入DOM解析器:Document doc = builder.parse(context.getAssets().open("person2.xml"));
Document
对象代表了一个XML文档的模型,所有的其他Node
都以一定的顺序包含在Document
对象内,排列成树状,以后对XML文档的所有操作都与解析器无关。NodeList
(列表类):代表一个包含一个或多个Node
的列表,有以下两个方法:item(index)
:返回集合的第index
个Node
项;getLength()
:列表的节点数
Node
(节点类):DOM中最基本的对象,代表文档树中的抽象节点,很少会直接使用;通常调用其子对象的Element
、Attr
、Text
等。Element
(元素类):Node
最主要的子对象,在元素中可以包含属性,因此有获取属性的方法:getAttrbute()
:获取属性值getTagName()
:获取元素名称
Attr
(属性类):代表某个元素的属性,虽然Attr
继承自Node
接口,但因为Attr
是包含在Element
中的,但并不能将其看做是Element
的子对象,因为Attr
并不是DOM树的一部分。
核心代码:DOM解析类——DomHelper.java
1 |
package com.ly.allendemowebservice; import android.content.Context; |
5. PULL解析XML数据
除了SAX和DOM解析XML之外,Android系统内置了Pull解析器用来解析XML,比如SharedPreference
就是使用内置的pull解析配置文件的。它的使用和SAX类似,都是采用事件驱动来完成XML的解析,而pull代码比较简单,只需处理开始和结束的事件,通常使用switch
语句,根据事件不同的类型,匹配不同的处理方式,有五种事件:START_DOCUMENT
、START_TAG
、TEXT
、END_TAG
、END_DUCOMENT
。
XML pull 提供了开始元素和结束元素。当某个元素开始的时候,可以调用paser.nextText
从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument
事件。在PULL解析过程中返回的是数字,且需要自己获取产生事件然后做出相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码:读取到XML的声明返回START_DOCUMENT
;结束返回END_DOCUMENT
;开始标签返回START_TAG
;结束标签返回END_TAG
;文本返回TEXT
。
使用PULL解析XML的流程:
获取一个
XmlPullPaser
类的引用:1
2
3
4// 方式1:通过xml解析工厂获得实体类
XmlPullPaserFactory factory = XmlPullPaserFactory.newInstance(); XmlPullPaser paser = factory.newPullPaser();
// 方式2:直接获得实体类
XmlPullPaser paser = Xml.newPullPaser();为
paser
解析器对象提供xml流与编码格式:1
paser.setInput(xml, "UTF-8");
获得事件的类型:
1
int eventType = paser.getEventType();
用
switch
对不同的事件类型进行不同的处理:
START_DUCUMENT
:开始读文档时触发,在这里完成初始化操作;START_TAG
:开始读标签,通过paser
的getName()
方法获得标签名信息比较,使用getAttributeValue(index)
获取属性值;- 对于文字节点
TEXT
可以使用paser.nextText()
获得节点内容; END_TAG
:标签结束;paser.next()
:循环解析下一个元素。
核心代码:PULL解析XML——PullHelper.java
1 |
package com.ly.allendemowebservice; import org.xmlpull.v1.XmlPullParser; |
使用:
1 |
try { |
使用PULL生成XML数据的流程:
创建
XMlSerializer
(XML序列化类)的实例:1
XmlSerializer serializer = Xml.newSerializer();
为
XmlSerializer
设置输出流与编码格式:1
serializersetOutput(out, "UTF-8");
为
XMlSerializer
设置XML的编码格式:1
serializer.startDocument("UTF-8", true);
设置根元素:
1
serializer.startTag(null, "person");
使用
foreach
循环遍历persons
集合中所有的元素,同时依次写入标签与属性:1
2
3
4
5
6
7
8
9
10
11for(Person p: persons){
serializer.startTag(null, "person");
serializer.attribute(null, "id", p.getId() + "");
serializer.startTag(null, "name");
serializer.text(p.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(p.getAge() + "");
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}设置跟踪完结元素:
1
serializer.endTag(null, "persons");
结束文档编写:
1
serializer.endDocument();
调用
flush()
,将内存中的数据写入文件中并关闭输出流1
2out.flush();
out.close();
核心代码:
1 |
public static void save(List<Person> persons, OutputStream out) throws Exception { |
Demo地址:Allen_Demo_WebService
二、Android XML数据解析的更多相关文章
- Android XML数据解析
XML:可扩展标记语言.一般用于数据存储,SharedPreference就是使用xml文件保存信息的,SQLite底层也是xml文件,在网络方面通常作为信息的载体,把数据包装成xml来传递. XML ...
- iOS开发——网络Swift篇&JSON与XML数据解析
JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit) 一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...
- xml数据解析
xml数据解析 在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.Kiss ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- xml数据解析调研
XML数据解析http://www.tuicool.com/articles/Nraau2(必用) http://www.cnblogs.com/pengyingh/articles/2342699. ...
- iOS开发网络篇之Web Service和XML数据解析
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
- 关于C#对Xml数据解析
首先进行简单说明Xml 与Html 和 XAML数据标签的差别. 1.Xml属于数据文本, 被设计为传输和存储数据,其焦点是数据的内容.它与json格式数据相似,可作为服务数据传输类型. 其中XML ...
- Android 之XML数据解析(2)—— SAX解析
(以下文章基本照抄郭霖大神的<第一行代码>) 在Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件.今天讲另外一种方式,SAX解析XML文件. ...
- Android json 数据解析
1.json格式 2.json解析 3.gson解析 4.fastjson解析 一.Json格式 json一种轻量级的数据交换格式.在网络上传输交换数据一般用xml, json. 两种结构: 1)对象 ...
随机推荐
- c语言中用简单方法对多维数组进行初始化
例:int array[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; 说明:a.由4*3可知,本二维数组包含12个元素,因此初始化时array[0][0] = 1 ,ar ...
- JavaSE--类加载器
参考:http://www.importnew.com/6581.html Java 编译器会为虚拟机转换源指令.虚拟机代码存储在以 .class 为扩展名的类文件中,每个类文件都包含某个类或者接口的 ...
- linux服务器开放防火墙和端口,以及查询状态
自己搞一个自己网站时候,购买的阿里云服务器,发现部署项目访问不到,首先需要确认入站规则是否配置. 一.安全组列表添加 1.打开安全组列表 2.添加入站规则 3.添加安全组规则 二.通过防火墙,开启端口 ...
- NWERC 2015
2015-2016 Northwestern European Regional Contest (NWERC 2015) F H没做 似乎只有 B 题有点意思 D:数论分块枚举所有上取整区间,只需要 ...
- 编译x64c++出错,errorC1900:P1和P2之间 Il 不匹配问题
搜索了下相关资料,有一个说法是编译x64时本地缺失一些东西,2015安装update3就行. 我的是2013update4,找了下最新的有update5,安装然而并没有什么用. 最后还是重新找对应版本 ...
- [GX/GZOI2019]与或和(单调栈+按位运算)
首先看到与或,很显然想到按照位拆分运算.然后就变成了0/1矩阵,要使矩阵在当前位与为1,则矩阵全为1,如果是或为1,则是矩阵不全为0,然后求全为0/1的矩阵个数即可.记录c[i][j]表示以a[i][ ...
- LeetCode No.106,107,108
No.106 从中序与后序遍历序列构造二叉树 题目 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 示例 例如,给出 中序遍历 inorder = [9,3,15,2 ...
- 我是如何在四年时间里,从厨师转行为 Serverless 应用开发者
▎本文系译文,我的软件开发入行经历非常有趣 -- 我一开始其实是厨师. 作者:KieranMcCarthy 译者:Aceyclee 我在高中时就喜欢烹饪和烘焙,用不同食材的搭配去做出美味的食物,就像个 ...
- 系统学习Javaweb5----JavaScript1
注意:java和JavaScript没有半毛钱关系!!! 说明:过年歇着歇着不知不觉就歇了七天,嘿嘿,从今天开始继续学习. 学习笔记: 1.JavaScript概述. 1.1.JavaScript是什 ...
- SGD/BGD/MBGD使用python简单实现
算法具体可以参照其他的博客: 随机梯度下降: # coding=utf-8 ''' 随机梯度下降 ''' import numpy as np # 构造训练数据 x = np.arange(0., 1 ...