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

解析XML:DOM,SAX,PULL的更多相关文章

  1. - XML 解析 总结 DOM SAX PULL MD

    目录 目录 XML 解析 总结 DOM SAX PULL MD 几种解析方式简介 要解析的内容 DOM 解析 代码 输出 SAX 解析 代码 输出 JDOM 解析 代码 输出 DOM4J 解析 代码 ...

  2. Android 通过Dom, Sax, Pull解析网络xml数据

    这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...

  3. JAVA解析XML之SAX方式

    JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...

  4. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  5. python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  6. [转载] python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  7. Android解析XML之SAX解析器

    SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...

  8. xml——dom&sax解析、DTD&schema约束

    dom解析实例: 优点:增删改查一些元素等东西方便 缺点:内存消耗太大,如果文档太大,可能会导致内存溢出 sax解析: 优点:内存压力小 缺点:增删改比较复杂 当我们运行的java程序需要的内存比较大 ...

  9. Android系列--DOM、SAX、Pull解析XML

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

随机推荐

  1. CAS实战のclient自定义过滤器

    我们在配置cas client肯定写过如下代码: <filter> <filter-name>CASFilter</filter-name> <filter- ...

  2. network_node:host解决Docker容器化部署微服务出现的Dobbo通信问题

    在Docker中,有时候出现 ports:   - 20880:20880 Dobbo通信出现问题. 此时应该改成 network_node:host 注释 ports!

  3. Easy mistakes in c#

    ACCESS MODIFIERS c# has some access modifiers as below: public:class or member can be accessed by no ...

  4. PipelineDB On Kafka

    PipelineDB 安装yum install https://s3-us-west-2.amazonaws.com/download.pipelinedb.com/pipelinedb-0.9.8 ...

  5. 执行计划--WHERE条件的先后顺序对执行计划的影响

    在编写SQL时,会建议将选择性高(过滤数据多)的条件放到WHERE条件的前面,这是为了让查询优化器优先考虑这些条件,减少生成最优(或相对最优)的执行计划的时间,但最终的执行计划生成过滤顺序还是决定这些 ...

  6. kv数据库对比总结

    集群型: hbase Cassandra scylladb redis类: redis + twemproxy codis 持久型: pika ssdb

  7. 离线下载解决Nuget程序包及其依赖包的方法

    由于使用的一台电脑没有联网,但是需要asp.net core项目时使用到一个package,于是在nuget.org上手动下载.但是最后发现,依赖的包实在太多,手动下载太费时.于是晚上花时间研究了一下 ...

  8. [uwp]MVVM之MVVMLight,一个登录注销过程的简单模拟

    之前学MVVM,从ViewModelBase,RelayCommand都是自己瞎写,许多地方处理的不好,接触到MVVMLigth后,就感觉省事多了. 那么久我现在学习MVVMLight的收获,简单完成 ...

  9. 【cocos2d-x 手游研发小技巧(4)与Android混编实现换“头像图片”】

    cocos2dx在android平台上的游戏开发中往往会遇到一些混编需求,如: 比方有的社区类游戏需要用到更换玩家的“头像”操作,其实就是调用android servers服务里面的本地图片,以及选取 ...

  10. 流式处理框架storm浅析(下篇)

    本文来自网易云社区 作者:汪建伟 举个栗子 1 实现的目标 设计一个系统,来实现对一个文本里面的单词出现的频率进行统计. 2 设计Topology结构: 这是一个简单的例子,topology也非常简单 ...