您的位置:首页 > 其它

解析XML:DOM,SAX,PULL

2016-04-03 11:49 423 查看

Android解析XML有三种方式:DOM(document object model)、SAX(simple api XML)、PULL

1、DOM

  DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将 XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX 来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

2、SAX

  SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。?SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

  这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器:

  • 解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),
  • 事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。

3、PULL

  Pull解析器的运行方式与 SAX 解析器相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。

  Pull解析和Sax解析不一样的地方有

  1. pull读取xml文件后触发相应的事件调用方法返回的是数字
  2. pull可以在程序中控制想解析到哪里就可以停止解析。

DOME-smsBackup

public void click(View view) {
// TODO Auto-generated method stub
List<SmsInfo> smsInfos = new ArrayList<SmsInfo>();
Cursor cursor = getContentResolver().query(Uri.parse("content://sms/"),
new String[] { "address", "body", "date", "type" }, null, null,
null);
while (cursor.moveToNext()) {
String address = cursor.getString(0);
String body = cursor.getString(1);
long date = cursor.getLong(2);
int type = cursor.getInt(3);
SmsInfo smsInfo = new SmsInfo(address, body, date, type);
smsInfos.add(smsInfo);
}
SmsUtils.smsBackupXml(smsInfos, getApplicationContext());
cursor.close();
}
public static void smsBackupXml(List<SmsInfo> smsInfos, Context context) {
try {
FileOutputStream fos = new FileOutputStream(new File(
Environment.getExternalStorageDirectory(), "smsBackup.xml"));
XmlSerializer xSerializer = Xml.newSerializer();
xSerializer.setOutput(fos, "utf-8");

xSerializer.startDocument("utf-8", true);
xSerializer.startTag(null, "smss");
for (SmsInfo smsInfo : smsInfos) {
xSerializer.startTag(null, "sms");
xSerializer.attribute(null, "id", smsInfo.getId() + "");

xSerializer.startTag(null, "address");
xSerializer.text(smsInfo.getAddress());
xSerializer.endTag(null, "address");

xSerializer.startTag(null, "body");
xSerializer.text(smsInfo.getBody());
xSerializer.endTag(null, "body");

xSerializer.startTag(null, "date");
xSerializer.text(smsInfo.getDate() + "");
xSerializer.endTag(null, "date");

xSerializer.startTag(null, "type");
xSerializer.text(smsInfo.getType() + "");
xSerializer.endTag(null, "type");

xSerializer.endTag(null, "sms");
}
xSerializer.endTag(null, "smss");
xSerializer.endDocument();

fos.close();
Toast.makeText(context, "备份成功", 1).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(context, "备份失败", 1).show();
}
}

这个demo是最简版,如果要运用到较大数据上时需添加线程,否则会因主线程阻塞导致备份失败

http://www.android100.org/html/201409/07/63419.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: