Demo下载地址:

  • coding下载: https://coding.net/u/yuhaiyang/p/XmlParser/git
  • csdn免积分下载:http://download.csdn.net/detail/u011634756/8927885
    注意: Demo是用AndroidStudio写的

解析器说明

  • SAX解析器:
    SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
    SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
  • DOM解析器:
    DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
    由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
  • PULL解析器:
    PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器

一. Pull解析和生成Xml

a. Pull解析Xml

主要流程:

  • 1.获取解析对象
  • 2.设置属性
  • 3.通过循环解析

具体代码:

   // 初始化Pull解析对象   XmlPullParser parser = Xml.newPullParser();   parser.setInput(input, "UTF-8");   // 获取第一个标签对象   int eventType = parser.getEventType();   /**    * 流程:    *   1. XmlPullParser.START_DOCUMENT    开始    *   2. XmlPullParser.START_TAG         标签开始    *   3. XmlPullParser.END_TAG           标签结束    *   4. XmlPullParser.END_DOCUMENT      结束    *    *   流程1,4 只会走一次,  2 和 3 有几个标签 就会循环几次    */   while (eventType != XmlPullParser.END_DOCUMENT) {       switch (eventType) {           case XmlPullParser.START_DOCUMENT:                    break;           case XmlPullParser.START_TAG:                   break;           case XmlPullParser.END_TAG:                   break;       }       // 获取下一个标签       eventType = parser.next();   }

b. Pull生成XML

主要流程:

  • 1.获取写入对象
  • 2.设置属性
  • 3.循环写入

具体代码:

  // 获取写入对象  XmlSerializer serializer = Xml.newSerializer();  // 添加Wirter和配置属性  StringWriter writer = new StringWriter();  //设置输出方向为writer  serializer.setOutput(writer);  // 开始写入标头  serializer.startDocument("UTF-8", true);  changeLine(serializer);  serializer.startTag("", "books");  /**   * a. 博客里面就简单的写入一个不一一列举   * b. changeLine 是一个换行的方法可忽略   * 添加方法:   *    1. startTag 设置tag   *    2. text 设置 tag对应的内容   *    3. endTag  结束tag   */  for (Book book : books) {      changeLine(serializer);      serializer.startTag("", "name");      serializer.text(book.getName());      serializer.endTag("", "name");  }  serializer.endTag("", "books");  serializer.endDocument();

二. Sax解析和生成xml

a. Sax解析Xml

主要流程:

  • 1.创建工厂对象
  • 2.通过工厂来生成解析器
  • 3.实例化 DefaultHandler (解析内容都会输出到Handle内)
  • 4.开始解析

具体代码:

// 获取工厂对象SAXParserFactory factory = SAXParserFactory.newInstance();// 通过工厂来生成解析器SAXParser parser = factory.newSAXParser();// 实例化 DefaultHandlerSaxParserHandler handler = new SaxParserHandler();// 开始解析parser.parse(is, handler);/** Handler 的调用流程 *  1. startDocument *  2. startElement 开始解析 *  3. characters 当前行解析的结果 *  4. endElement 只有遇到才会调用到 */private class SaxParserHandler extends DefaultHandler {    // 开始解析 可以在这个里面初始化对象    @Override    public void startDocument() throws SAXException {    }    // 开始解析标签    /**     * localName 和 name 对应的是 标签的名字,     *  attr里面包含的是属性     */    @Override    public void startElement(String uri, String localName, String name, Attributes attr) throws SAXException {        super.startElement(uri, localName, name, attr);    }    // 当前标签解析出来的内容     /**     *  ch 是当前标签解析出来的内容, 可以赋值了.     */    @Override    public void characters(char[] ch, int start, int length) throws SAXException {        super.characters(ch, start, length);    }    // 当遇到时候解析当前标签完毕    @Override    public void endElement(String uri, String localName, String name) throws SAXException {        super.endElement(uri, localName, name);    }}

b. Sax生成Xml

主要流程:

  • 1.创建工厂对象
  • 2.通过工厂生成 对象
  • 3.设定相关参数
  • 4.循环添加

具体代码:

//创建工厂对象SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance();//通过工厂生成 对象TransformerHandler handler = factory.newTransformerHandler();// Transformer 设定参数 编码方式等Transformer transformer = handler.getTransformer();// 设置输出采用的编码方式transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");// 是否自动添加额外的空白transformer.setOutputProperty(OutputKeys.INDENT, "yes");// 是否忽略XML声明transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");StringWriter writer = new StringWriter();Result result = new StreamResult(writer);handler.setResult(result);//代表命名空间的URI 当URI无值时 须置为空字符串String uri = "";//命名空间的本地名称(不包含前缀) 当没有进行命名空间处理时 须置为空字符串String localName = "";// 缩进String tab = "\n    ";String two_tab = "\n        ";char[] ch = null;// 开始写入handler.startDocument();// 这里需要考虑写入换行ch = HaiYangUtils.NEW_LINE.toCharArray();handler.characters(ch, 0, ch.length);// 写入books标签handler.startElement(uri, localName, "books", null);//负责存放元素的属性信息AttributesImpl attrs = new AttributesImpl();/** * 循环写入每一个标签 * 写入流程: *    1. startElement *    2. characters *    3. endElement *  和解析的流程是一样的! */for (Book book : books) {    //清空属性列表    attrs.clear();    //添加一个名为id的属性(type影响不大,这里设为string    // 例如:     //attrs.addAttribute(uri, localName, "id", "string", String.valueOf(book.getId()));    // 插入换行    ch = tab.toCharArray();    handler.characters(ch, 0, ch.length);    //开始一个book元素 关联上面设定的id属性    handler.startElement(uri, localName, "book", attrs);    //开始一个name元素 没有属性    ch = two_tab.toCharArray();    handler.characters(ch, 0, ch.length);    handler.startElement(uri, localName, "name", null);    ch = String.valueOf(book.getName()).toCharArray();    handler.characters(ch, 0, ch.length);    handler.endElement(uri, localName, "name");    // 开始一个id元素    ch = two_tab.toCharArray();    handler.characters(ch, 0, ch.length);    handler.startElement(uri, localName, "id", null);    ch = String.valueOf(book.getId()).toCharArray();    handler.characters(ch, 0, ch.length);    handler.endElement(uri, localName, "id");    //开始一个price元素 没有属性    ch = two_tab.toCharArray();    handler.characters(ch, 0, ch.length);    handler.startElement(uri, localName, "price", null);    ch = String.valueOf(book.getPrice()).toCharArray();    handler.characters(ch, 0, ch.length);    handler.endElement(uri, localName, "price");    // book的结束    ch = tab.toCharArray();    handler.characters(ch, 0, ch.length);    handler.endElement(uri, localName, "book");}handler.endElement(uri, localName, "books");handler.endDocument();

三. Dom解析和生成xml

在Android中不常用,这里不进行Demo举例,如果想研究 自行研究Demo。


参考文献:

  • http://blog.csdn.net/liuhe688/article/details/6415593

更多相关文章

  1. Android(安卓)RIL 架构学习总结
  2. ListView的行中加了按钮的注意事项
  3. android 读取本地图片生成 bitmap
  4. Mac环境下交叉编译生成Android版本的Assimp.so
  5. Android(安卓)RIL 架构学习总结 .
  6. Fresco源码解析 - 创建一个ImagePipeline(一)
  7. Android利用Jsoup解析html
  8. Android(安卓)Parcelable对象生成:ParcelableGenerator
  9. Android通过xml文件配置数据库

随机推荐

  1. linux c (4) 进程终止-exit和_exit函数
  2. linux上/proc/cpuinfo中的bug是什么意思?
  3. 导出内存(linux中)
  4. 詹金斯死了,但是pid文件存在
  5. Linux BT下载(3)-与Tracker交互
  6. 【linux】下的mkfifo 命令 和【C语言】中
  7. Linux下的文件时间
  8. 第五章 个人优化vim第二步: 开启自带辅助
  9. Media-S 简介(一个开源的DRM解决方案)
  10. Linux-2.6 所有版本内核源码下载