SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
    SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX提供的是一种顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分、是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现。同DOM分析器相比,SAX分析器缺乏灵活性。然而,由于SAX分析器实现简单,对内存要求比较低,因此实现效率比较高,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。

例子:

使用SAX开始几步和DOM使用方式一致,

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

在第23行MyHandler2类中,我们看到有3个方法,startElement、characters、endElement,这三个方法是jdk中DefaultHandler的接口的实现。

  1. package com.sax;
  2.  
  3. import java.io.File;
  4. import java.util.Stack;
  5.  
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8.  
  9. import org.xml.sax.Attributes;
  10. import org.xml.sax.SAXException;
  11. import org.xml.sax.helpers.DefaultHandler;
  12.  
  13. public class SaxTest2 {
  14. public static void main(String[] args) throws Exception {
  15. SAXParserFactory factory = SAXParserFactory.newInstance();
  16.  
  17. SAXParser parser = factory.newSAXParser();
  18.  
  19. parser.parse(new File("student.xml"), new MyHandler2());
  20. }
  21. }
  22.  
  23. class MyHandler2 extends DefaultHandler {
  24. private Stack<String> stack = new Stack<String>();
  25.  
  26. private String name;
  27.  
  28. private String gender;
  29.  
  30. private String age;
  31.  
  32. private String pre;
  33.  
  34. @Override
  35. public void startElement(String uri, String localName, String qName,
  36. Attributes attributes) throws SAXException {
  37. // stack.push(qName);
  38. pre = qName;
  39.  
  40. for (int i = 0; i < attributes.getLength(); i++) {
  41. String attrName = attributes.getQName(i);
  42. String attrValue = attributes.getValue(i);
  43.  
  44. System.out.println(attrName + " = " + attrValue);
  45. }
  46. }
  47.  
  48. @Override
  49. public void characters(char[] ch, int start, int length)
  50. throws SAXException {
  51. // String tag = stack.peek();
  52. String tag = pre;
  53.  
  54. if ("姓名".equals(tag)) {
  55. name = new String(ch, start, length);
  56. } else if ("性别".equals(tag)) {
  57. gender = new String(ch, start, length);
  58. } else if ("年龄".equals(tag)) {
  59. age = new String(ch, start, length);
  60. }
  61. }
  62.  
  63. @Override
  64. public void endElement(String uri, String localName, String qName)
  65. throws SAXException {
  66. //stack.pop(); // 表示该元素已经解析完毕,需要从栈中弹出
  67.  
  68. if ("学生".equals(qName)) {
  69. System.out.println("姓名:" + name);
  70. System.out.println("性别:" + gender);
  71. System.out.println("年龄:" + age);
  72.  
  73. System.out.println();
  74. }
  75. pre = null;
  76. }
  77. }

3个方法通过图片描述如下,标签开始、标签中间内容、标签结束,其他以此类推,外面的“学生”标签规则也都一直。

其中qname这个参数指xml中每个元素头的名字,详见截图。

attributes参数含义,详见截图。

具体的方法含义详见JDK,其中还包含好多其他方法,我们可以依需求进行实现。

附:

xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="student.xsd" >
  3. <学生 学号="1">
  4. <姓名>张三</姓名>
  5. <性别>男</性别>
  6. <年龄>20</年龄>
  7. </学生>
  8. <学生 学号="2">
  9. <姓名>李四</姓名>
  10. <性别>女</性别>
  11. <年龄>19</年龄>
  12. </学生>
  13. <学生 学号="3">
  14. <姓名>王五</姓名>
  15. <性别>男</性别>
  16. <年龄>21</年龄>
  17. </学生>
  18. </学生名册>

输出结果

  1. xmlns:xsi = http://www.w3.org/2001/XMLSchema-instance
  2. xsi:noNamespaceSchemaLocation = student.xsd
  3. 学号 = 1
  4. 姓名:张三
  5. 性别:男
  6. 年龄:20
  7.  
  8. 学号 = 2
  9. 姓名:李四
  10. 性别:女
  11. 年龄:19
  12.  
  13. 学号 = 3
  14. 姓名:王五
  15. 性别:男
  16. 年龄:21

注意:

截图中,该行全局变量在此方法结束后需要清空,因为是全局变量如果不清空,会影响程序后续执行,可以尝试注掉该行代码试试。

xml--通过SAX解析XML的更多相关文章

  1. Android之SAX解析XML

    一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...

  2. Android 使用pull,sax解析xml

    pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...

  3. JAVA使用SAX解析XML文件

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

  4. DOM&SAX解析XML

    在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...

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

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

  6. SAX解析xml浅析

    SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,占用内存较少(相对 ...

  7. JavaWeb学习日记----SAX解析XML

    1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...

  8. 用SAX解析xml文件,java

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

  9. Python:使用基于事件驱动的SAX解析XML

    SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...

  10. Android SAX解析XML

    本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍: SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度 ...

随机推荐

  1. Android面试宝典(转)

    Java知识点包括:接口与抽象的使用及区别,多线程,socket基础,集合类,也有个别公司考察定义,很无语. C/C++知识点包括:指针的移动,排序算法,链表,有时还会有二叉树的遍历或图的遍历. 1. ...

  2. 面试大总结:Java搞定面试中的链表题目总结

    package LinkedListSummary; import java.util.HashMap; import java.util.Stack; /** * http://blog.csdn. ...

  3. matlab 怎么保存plot的图 到指定文件夹

    %%使用print函数,第一个参数一定是figure的句柄,第二个参数设置格式,第三个参数是指定文件夹 %代码如下 h=figure; plot(1:10); print(h,'-djpeg','F: ...

  4. DIV内英文或者数字不换行的问题 解决办法

    word-wrap:break-word; word-break:break-all;

  5. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)1----C#中动态加载和卸载DLL

    我们知道在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载. 在C#中我们也能使用Assembly.Load ...

  6. Android开发之ADT导入Support Library

    在工程中增加(例如 support-v4 Library) 在ADT中需要按照以下步骤:  1.右击当前工程,查找Properties 2.选择Java Build Path 3.选择Librarie ...

  7. 使用net start mysql的时候出现服务名无效的原因及解决办法

    原因:mysql服务没有安装 解决办法:使用管理员权限,执行mysqld -install命令 然后以管理员身份net start mysql开启mysql服务 卸载mysql服务的方法 1.管理员权 ...

  8. POJ 2398 Toy Storage

    这道题和POJ 2318几乎是一样的. 区别就是输入中坐标不给排序了,=_=|| 输出变成了,有多少个区域中有t个点. #include <cstdio> #include <cma ...

  9. shape的属性

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  10. shareSDK实现QQ第三方登录

    // QQ登录 case R.id.login_share_qq: Platform qq = ShareSDK.getPlatform(QQ.NAME); qq.SSOSetting(false); ...