二、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)对象 ...
随机推荐
- 基于SpringBoot框架企业级应用系统开发全面实战
Eclipse 安装spring-tool-suite教程,并创建一个新的springboot项目 使用SpringBoot构建项目,加载SSM整合的applicationContext.xml的注解 ...
- 如何决定 Web 应用的线程池大小
在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务.通常是通过 ...
- Gson使用指南(一)
注:此系列基于Gson 2.4. 一.Gson的基本用法 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化.同时每个方法都提供了 ...
- HTML学习的一些笔记
为什么会出现HTML这个标记语言 超文本标记语言 HyperText Markup Language HTML是超文本标记语言,标准通用标记语言的一个应用. "超文本"就是指页面内 ...
- 关于tomcat启动错误:At least one JAR was scanned for TLDs yet contained no TLDs
一.问题原因: 1.出现这个问题的原因就是Tomcat启动时会扫描大量jar包,如果含有不符合TLD规范的就会出现这个问题 2.以后基本上不会使用JSP作为视图层,所以我们可能根本不需要TLD这个东西 ...
- CaptchaCodeManager
package org.linlinjava.litemall.wx.service; import org.linlinjava.litemall.wx.dto.CaptchaItem; impor ...
- 初识数据库MySQL
一.认识数据库 1:什么是数据(Data) 描述事物的符号记录被称为数据,这个符号可以是数字,文字,图片,声音,语言等 2:什么是数据库(DataBase,简称DB) 数据库是存放数据的仓库,库一般 ...
- UI自动化(selenium+python)之元素定位的三种等待方式
前言 在UI自动化过程中,常遇到元素未找到,代码报错的情况.这种情况下,需要用等待wait. 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverW ...
- Ubuntu 设置静态 IP
一.背景 如果没有设置静态IP,由于某些情况,会导致系统的 IP 地址发生变化. 为了避免 IP 发生变化,就需要进行静态 IP 的设置. 注:这里 Ubuntu 版本为 19.10 二.解决方案 1 ...
- Nginx_安全2
Nginx与安全有关的配置 隐藏版本号 http { server_tokens off;} 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然 ...