Android中的XML解析
在安卓中主要有三种XML文档解析方式:DOM(Document Object Model), SAX(Simple API for XML), PULL
他们的主要特点如下表:
特点 | 主要类 | |
DOM | 1 由于是把整个XML文档以文档树的形式加载到内存中,所以内存消耗多,不适合手机这种内存稀缺的设备 2 使用简单 3 由于是把整个文档加载入内存,因此内存消耗较大 |
Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。 Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。 Node:该接口提供处理并获取节点和子节点值的方法。 NodeList:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。 DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。 |
SAX | 1 采用基于事件的回调方式,从文档开始读到文档结束,边解析边获取文档信息,内存消耗少 |
SAXParserFactory:创建SAXParser; SAXParser:获取XMLReader XMLReader:从输入流中获取xml数据 DefaultHandler:处理解析事件,核心类,重写此类实现对xml数据的有效获取 |
PULL | 安卓平台首选。与SAX方式差不多,都是基于事件驱动,但是用户可以对解析过程更好的控制,可以理解为解析过程是用户驱动(XmlPullParser.next())的。 | XmlPullParserFactory:创建XmlPullParser; XmlPullParser:从输入流中获取xml数据 |
由于在安卓中推荐使用PULL解析,下面说明使用PULL解析XML的主要内容。
- 获取XmlPullParser:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser(); - 设置XmlPullParser解析器的输入:
//XmlPullParser设置输入有两个方法:
//XmlPullParser.setInput(Reader reader);
//XmlPullParser.setInput(InputStream inputStream, String inputEncoding); - 解析XML文档数据。其主要工作就是调用XmlPullParser.next()获取数据,然后在调用XmlPullParser.getEventType()得到当前解析状态再做相应处理。
//XmlPullParser.getEventType()返回的状态类型
//START_DOCUMENT:Parser初始化的状态
//START_TAG:一个XML节点的开始,即‘<’符号
//END_TAG:一个XML节点的结束,即‘</’符号
//TEXT:Text内容
//END_DOCUMENT:XML文档读取结束注意:在编写XML的时候,若有缩进/换行等排版,则会把换行/缩进/空格等符号当做TEXT读取,返回TEXT状态。
测试实验:
在eclipse中编写如下xml文件:
然后编写如下解析代码:只包含主要部分:
private void pullParseXml(){
XmlPullParserFactory factory = null;
String name = "";
String author = "";
String tagName;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
InputStream inputStream = getAssets().open("pull.xml");
xpp.setInput(inputStream, null);
int eventType = xpp.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if(eventType == XmlPullParser.START_DOCUMENT){
log("START_DOCUMENT");
mBooks = new ArrayList<Book>();
}else if(eventType == XmlPullParser.START_TAG){
log("START_TAG:" + xpp.getName());
tagName = xpp.getName();
if("book".equals(tagName)){
name = "";
author = "";
} else if("author".equals(tagName)){
author = xpp.nextText();
log("author:" + author);
} else if("name".equals(tagName)){
name = xpp.nextText();
log("name:" + name);
}
} else if(eventType == XmlPullParser.END_TAG){
log("END_TAG");
tagName = xpp.getName();
if("book".equals(tagName)){
mBooks.add(new Book(author, name));
}
} else if(eventType == XmlPullParser.TEXT){
String textString = xpp.getText();
log("TEXT:" + textString);
}
eventType = xpp.next();
}
mTv.setText(mBooks.get(0).getInfo());
} catch (Exception e) {
// TODO: handle exception
}
} private void log(String s){
Log.d("TEST", s);
if(s.startsWith("TEXT:")){
Log.d("TEST", "length:" + s.length());
for(int i = 5; i < s.length(); ++i){
Log.d("TEST", "end char value:" + Integer.valueOf(s.charAt(i)));
}
}
}
然后得到的log如下:
02-28 05:26:55.395: D/TEST(2469): START_DOCUMENT
02-28 05:26:55.395: D/TEST(2469): START_TAG:books
02-28 05:26:55.395: D/TEST(2469): START_TAG:book
02-28 05:26:55.395: D/TEST(2469): START_TAG:author
02-28 05:26:55.395: D/TEST(2469): author:libai
02-28 05:26:55.395: D/TEST(2469): START_TAG:name
02-28 05:26:55.395: D/TEST(2469): name:jingyesi
02-28 05:26:55.395: D/TEST(2469): END_TAG
02-28 05:26:55.395: D/TEST(2469): TEXT:
02-28 05:26:55.395: D/TEST(2469):
02-28 05:26:55.403: D/TEST(2469): length:7
02-28 05:26:55.403: D/TEST(2469): end char value:10
02-28 05:26:55.403: D/TEST(2469): end char value:9
02-28 05:26:55.403: D/TEST(2469): START_TAG:book
02-28 05:26:55.403: D/TEST(2469): TEXT:
02-28 05:26:55.403: D/TEST(2469):
02-28 05:26:55.403: D/TEST(2469): length:11
02-28 05:26:55.403: D/TEST(2469): end char value:10
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): end char value:9
02-28 05:26:55.403: D/TEST(2469): START_TAG:author
02-28 05:26:55.403: D/TEST(2469): author:dufu
02-28 05:26:55.403: D/TEST(2469): TEXT:
02-28 05:26:55.403: D/TEST(2469):
02-28 05:26:55.403: D/TEST(2469): length:9
02-28 05:26:55.403: D/TEST(2469): end char value:10
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): end char value:32
02-28 05:26:55.403: D/TEST(2469): START_TAG:name
02-28 05:26:55.403: D/TEST(2469): name:denggao
02-28 05:26:55.403: D/TEST(2469): END_TAG
02-28 05:26:55.403: D/TEST(2469): TEXT:
02-28 05:26:55.403: D/TEST(2469): length:6
02-28 05:26:55.403: D/TEST(2469): end char value:10
02-28 05:26:55.403: D/TEST(2469): END_TAG
在ASCII码中,9,10,32分别表示的就是制表符,换行以及空格。从log中我们可以清晰的看到,XmlPullParser把为了排版而加入的换行,缩进,空格字符都当做TEXT解析了,并且触发了TEXT事件。
Android中的XML解析的更多相关文章
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- 修改Android中strings.xml文件, 动态改变数据
有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法.strings.xml中节点是支持占位符的,如下所示: <string name=&qu ...
- android 中theme.xml与style.xml的区别
from://http://liangoogle.iteye.com/blog/1848448 android 中theme.xml与style.xml的区别: 相同点: 两者的定义相同. <r ...
- Android中通过xml改变背景及文字颜色
原创文章,转载请注明出处,谢谢! 本篇主要介绍Android开发中,通过XML资源文件来设置控件在不同状态下的背景及文字颜色.关于xml改变背景及文字颜色的原理,大家可以去看一下郭霖大神的源码分析文章 ...
- 解决在php5中simple XML解析错误的问题
2004年7月,php5正式版本的发布,标志着一个全新的PHP时代的到来.PHP5的最大特点是引入了面向对象的全部机制,并且保留了向下的兼容性.程序员不必再编写缺乏功能性的类,并且能够以多种方法实现类 ...
- Android中使用Gson解析JSON数据
Android中使用Gson解析JSON数据 在Android中可以使用Gson解析JSON数据 首先,从 code.google.com/p/google-gson/downloads/list ...
- Android之旅十四 android中的xml文件解析
在我们做有关android项目的时候,肯定会涉及到对xml文件的解析操作.以下给大家介绍一下xml文件的解析.包括DOM.SAX.Pull以及曾经我们用到的DOM4J和JDOM: 要解析的XML文件: ...
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...
随机推荐
- 多语言架构下如何正确的使用SQL视图
产品的定位 做产品的都知道,是否支持多语言直接影响到产品的定位问题. 如果一个产品周期是一年的话,要完美支持多语言最少也得在加3个月!所需时间和页面数量.数据库表的数量和表的数据量成正比. 可以看出代 ...
- JS的toFixed方法设置小数点位数后再进行计算,数据出错问题
这个应该算作失真,或者也不算.情况就是用了toFixed后再进行相关计算,得不到预期的结果 具体看例子 比如想动态计算百分比,保留一位小数如94.4%这样子 var blobTo = 409600; ...
- Load Audio or Vedio files
//Load Audio or Vedio files private void btnLoadFile_Click(object sender, EventArgs e) { Startindex ...
- 表单input中录入资料的检查方法及示例
本文内容 表单录入信息的检查原则 常见检查的三种方法 示例 输入框有字符长度的限制 输入框有输入字符个数范围的限制 知识补给--检查方式的介绍 输入框只可(或不可)输入数 ...
- WPFINotifyPropertyChanged使用技巧
WPFINotifyPropertyChanged使用技巧 public class NotifyPropertyChanged : INotifyPropertyChanged { public e ...
- 百度云推送-服务端 C# SDK
思路: 1.公司有项目需要做android和ios手机端推送消息的功能: 2.没有接触过这方面的知识,一头雾水,开始在网上一顿搜,网上倒是有不少解决方案,首先搜的是android的解决方案,因为ios ...
- C# 操作鼠标移动到指定的屏幕位置方法
/// <summary> /// 引用user32.dll动态链接库(windows api), /// 使用库中定义 API:SetCursorPos /// </summary ...
- Go学习笔记之基础数据类型
http://studygolang.com/articles/1348 1 整数 在 Go 语言中,如果不加特殊前缀,都是10进制表示,例如:“100” 整数可以直接用指数形式,例如:“1E9”,意 ...
- 设计模式/原则篇- Unit of Work
概念 Unit of Work 即工作单元. 用来维护一组受业务影响的对象列表,将多个操作放在一个单元中,把操作原子化,通过事务统一完成一次提交,如果某个过程出现异常,就将所有修改进行回滚,保证数据的 ...
- CAS客户端服务器端配置步骤
来自我的个人网站:http://lkf.22web.org/ cas介绍: CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 ...