解析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解析不一样的地方有
- pull读取xml文件后触发相应的事件调用方法返回的是数字
- 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是最简版,如果要运用到较大数据上时需添加线程,否则会因主线程阻塞导致备份失败
相关文章推荐
- iOS开发总结之项目开发中使用UITableView几百行代码搞定级联表格
- pandas学习笔记
- c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)
- 输入字符,输出字符时加行号
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- NumPy学习笔记
- 1035 Lunch Rush (水题)
- iOS本地存储2--CoreData存储数据
- 个人网站实现扫码登录asp.net 扫码登录
- 支持向量机SVM(二)
- 不同类型数据间的转换
- 坦克游戏教程二:实现坦克移动以及方向控制
- 《Java程序设计》第五周学习总结
- PHP168 V4.0 cookie欺骗 EXP
- cordova plugin 安卓原生插件开发笔记(一)
- Poj 3614 Sunscreen【贪心+优先队列】
- Android图片加载框架Picasso最全使用教程
- Android图片加载框架Picasso最全使用教程 一
- Android中配置JDK和SDK的环境变量