SAX解析XML

  1、分析

    SAX是按照XML文件的顺序执行,可以说是边扫描,边解析。所以无须将整个文件加载至内存中。

  

  2、优点

    1)占用内存少。

    2)解析效率高。

  

  3、缺点

    1)只能进行读取。

    2)无法修改xml中节点数据。

    3)无法知道正在遍历的节点的上一节点的名称,并且无法任意访问某一节点。

  

  4、使用场合

    1)大型XML文件,并且只需要一次性读取xml文件的内容。

  

  5、讲解

    1)自定义解析类需继承DefaultHandler( org.xml.sax.helpers.DefaultHandler)。

    2)重写父类中的多个方法即可。

      a)startDocument() : 该方法是开始解析xml的方法。

      b)startElement() : 该方法是解析某个标签(<name>),获取当前标签名称及属性。

      c)characters() : 在解析到某个标签时,获取标签内容值的时候调用。

      d)endElement() : 该方法为某个标签(</name>)解析完后调用。

      e)endDocument() : 该方法为整个xml文件解析完时调用。

  6、详解

    1)XML文件示例

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <books>
  4. <book>
  5. <id>10001</id>
  6. <name>JAVA BOOK</name>
  7. <author>James Gosling</author>
  8. <publishDate>2017-04-24</publishDate>
  9. </book>
  10. <book>
  11. <id>10002</id>
  12. <name>C BOOK</name>
  13. <author>Dennis Ritchie</author>
  14. <publishDate>2017-04-24</publishDate>
  15. </book>
  16. </books>

    2)自定义SAXParserHandler类,继承DefaultHandler类,重写5个方法。

  1. package com.mean.xml.sax.handler;
  2.  
  3. import org.xml.sax.Attributes;
  4. import org.xml.sax.SAXException;
  5. import org.xml.sax.helpers.DefaultHandler;
  6.  
  7. /**
  8. * SAX解析XML文件
  9. * @author zhangjk
  10. */
  11. public class SAXParserHandler extends DefaultHandler {
  12. private boolean isUsefulElement;
  13.  
  14. public SAXParserHandler() {
  15. isUsefulElement = false;
  16. }
  17.  
  18. @Override
  19. public void startDocument() throws SAXException {
  20. super.startDocument();
  21. System.out.println("--------开始解析XML--------");
  22. }
  23.  
  24. @Override
  25. public void startElement(String uri, String localName, String element, Attributes attributes) throws SAXException {
  26. if (element.equals("books")) {
  27. isUsefulElement = true;
  28. } else if (element.equals("book")) {
  29. System.out.println("--------开始解析本书--------");
  30. isUsefulElement = true;
  31. } else {
  32. System.out.println("element:" + element);
  33. isUsefulElement = false;
  34. }
  35. }
  36.  
  37. @Override
  38. public void characters(char[] ch, int start, int length) throws SAXException {
  39. if (!isUsefulElement) {
  40. String value = new String(ch, start, length).trim();
  41. if (!value.isEmpty()) {
  42. System.out.println("value:" + value);
  43. }
  44. }
  45. }
  46.  
  47. @Override
  48. public void endElement(String uri, String localName, String element) throws SAXException {
  49. if (element.equals("book")) {
  50. System.out.println("--------书本解析完毕--------");
  51. }
  52. }
  53.  
  54. @Override
  55. public void endDocument() throws SAXException {
  56. super.endDocument();
  57. System.out.println("--------XML解析完毕--------");
  58. }
  59.  
  60. public static SAXParserHandler getInstance() {
  61. if (SAXParserHanderSingle.INSTANCE == null) {
  62. SAXParserHanderSingle.INSTANCE = new SAXParserHandler();
  63. }
  64. return SAXParserHanderSingle.INSTANCE;
  65. }
  66.  
  67. private static class SAXParserHanderSingle {
  68. private static SAXParserHandler INSTANCE = new SAXParserHandler();
  69. }
  70. }

  

  7、步骤

    1)首先获取SAXParserFactory(SAX解析工厂)对象。

    2)从SAXParserFactory对象中获取SAXParser(SAX解析)对象。

    3)创建自定义的SAXParserHandler类对象。

    4)调用步骤2中SAX解析对象的parse()方法,参数分别为XML文件的输入流,自定义的SAX解析类。    

  1. String path = Class.class.getResource("/").getPath() + "Book.xml";
  2. try {
  3. SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
  4. SAXParser saxParser = saxParserFactory.newSAXParser();
  5. SAXParserHandler sax = SAXParserHandler.getInstance();
  6. saxParser.parse(new FileInputStream(new File(path)), sax);
  7. } catch (ParserConfigurationException e) {
  8. e.printStackTrace();
  9. } catch (SAXException e) {
  10. e.printStackTrace();
  11. } catch (FileNotFoundException e) {
  12. e.printStackTrace();
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }

  注:本文部分参考引用

  1、http://blog.csdn.net/ydxlt/article/details/50183693

2017/4/25-SAX解析XML文件的更多相关文章

  1. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  2. 用SAX解析xml文件,java

    (此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...

  3. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  4. SAX解析xml文件

    需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...

  5. cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

    今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...

  6. 安卓SAX解析XML文件

    XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...

  7. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  8. Java中实现SAX解析xml文件到MySQL数据库

    大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...

  9. sax解析xml文件,封装到对象中

    创建User.java类 public class User { private String id; private String name; private String age; private ...

  10. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

随机推荐

  1. C++ 构造函数或析构函数调用虚函数

    构造函数和析构函数中的虚函数 在执行基类构造函数时,对象的派生类部分是未初始化的.实际上,此时对象还不是一个派生类对象. 为 了适应这种不完整,编译器将对象的类型视为在构造或析构期间发生了变化.在基类 ...

  2. ORACLE获取表信息方法

    获取表: select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select ...

  3. (6)简单说说java中的线程

    先甩出来两种创建线程的方法: private static int count = 100; public static void main(String[] args) { // 用继承Thread ...

  4. JavaScript高级程序设计(学习)

    文档模式是:混杂模式和标准模式. 若在文档开始处没有文档类型声明,则浏览器就会开启混杂模式.这种模式在不同的浏览器下行为差异非常大,如果不使用某些hack技术,跨浏览器的行为根本就没有一致性可言. 局 ...

  5. requireJS 从概念到实战

    requireJS 可以很轻易的将一个项目中的JavaScript代码分割成若干个模块(module).并且requireJS推荐一个模块就是一个文件,所以,你将获得一些零碎的具有互相依赖关系的JS文 ...

  6. java学习笔记 --- 方法

    一.方法  (1)方法:就是完成特定功能的代码块.   注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法.  (2)格式:   修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 ...

  7. TensorFlow anaconda命令备忘

    [查看tensorflow安装的版本] anaconda search -t conda tensorflow [选择版本安装] conda install -c anaconda tensorflo ...

  8. iOS开发之iOS程序的启动过程

    程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delega ...

  9. UIImageView帧动画相关属性和方法

    @property(nonatomic,copy) NSArray *animationImages; 需要播放的序列帧图片数组(里面都是UIImage对象,会按顺序显示里面的图片) @propert ...

  10. Akamai在内容分发网络中的算法研究(翻译总结)

    作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...