XML解析(二) SAX解析
XML解析之SAX解析:
SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得。
注意SAXParser的parse()方法:
parse(String uri, DefaultHandler dh),parse(File f, DefaultHandler dh)等都需要传递一个DefaultHandler的对象。
查看API帮助手册可知,SAX解析是事件驱动的,DefaultHandler是SAX2 事件处理程序的默认基类,在 org.xml.sax.helpers 软件包中,由它来实现相关事件的回调,并提供所有回调方法默认的空实现。
DefaultHandler的常用回调方法:
void startDocument():接收文档开始的通知。
void startElement(String uri, String localName, String qName, Attributes attributes): 接收元素开始的通知。
void characters(char[] ch, int start, int length): 接收元素中字符数据的通知。
void endElement(String uri, String localName, String qName):接收元素结束的通知。
void endDocument(): 接收文档结束的通知。
为什么说SAX是推模式解析?
SAX 解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,由解析器自动调用相应事件方法,而不是由我们自己去调用。
使用SAX解析XML,观察各种事件回调:
有如下要解析的xml文件:

1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
3 <students>
4
5 <student id="003">
6
7 <name>xiaoqiao</name>
8
9 </student>
10
11 </students>

解析代码:

1 public class SaxXmlParser {
2
3 public static void main(String[] args) {
4
5 SAXParserFactory factory = SAXParserFactory.newInstance();
6
7 try {
8
9 SAXParser parser = factory.newSAXParser();
10
11 parser.parse("students_bak.xml", new DefaultHandler(){
12
13 @Override
14
15 public void characters(char[] ch, int start, int length)
16
17 throws SAXException {
18
19 System.out.println("read characters:"+new String(ch,start,length));
20
21 }
22
23 @Override
24
25 public void endDocument() throws SAXException {
26
27 System.out.println("end document...");
28
29 }
30
31 @Override
32
33 public void endElement(String uri, String localName, String qName)
34
35 throws SAXException {
36
37 System.out.println("end element:<"+qName+">");
38
39 }
40
41 @Override
42
43 public void startDocument() throws SAXException {
44
45 System.out.println("start document...");
46
47 }
48
49 @Override
50
51 public void startElement(String uri, String localName, String qName, Attributes attributes)
52
53 throws SAXException {
54
55 System.out.println("start element:<"+qName+">");
56
57 if(qName.equals("student")){
58
59 System.out.println("id="+attributes.getValue("id"));
60
61 }
62
63 }
64
65 });
66
67 } catch (Exception e) {
68
69 e.printStackTrace();
70
71 }
72
73 }
74
75 }

上面代码在parse()方法中,第二个参数定义了一个继承自DefaultHandler的匿名内部类对象,重写了5个主要的事件回调方法,用以观察事件的触发过程。
在startElement()方法中qName存放的是节点名,attributes存放的是该节点的属性,endElement()方法同样。
运行结果:
start document...
start element:<students>
read characters:
start element:<student>
id=003
read characters:
start element:<name>
read characters:xiaoqiao
end element:<name>
read characters:
end element:<student>
read characters:
end element:<students>
end document...
首先回调的是startDocument()方法;
然后碰到<students>节点,回调startElement()方法;
<students>后面有回车,所以会触发characters()方法,输出当前读到的字符;
然后碰到<student>节点,回调startElement()方法,输出id属性值;
后面也有回车,所以会触发characters()方法,输出当前读到的字符;
然后碰到了<name>节点,回调startElement()方法;
后面是xiaoqiao,回调characters()方法;
然后到</name>,回调endElement()方法;
碰到回车,回调characters()方法;
到</student>,回调endElement()方法;
碰到回车,回调characters()方法;
到</students>,回调endElement()方法;
文档结束,回调endDocument()方法,解析工作结束。
如果有需要对文档进行别的处理操作,如查找某个节点等,可以重写响应的事件回调方法,添加上需要的逻辑的实现代码即可。
XML解析(二) SAX解析的更多相关文章
- java拾遗2----XML解析(二) SAX解析
XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...
- Java SE之XML<二>XML DOM与SAX解析
[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- Java xml 操作(Dom4J修改xml + xPath技术 + SAX解析 + XML约束)
1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...
- XML.03-DOM和SAX解析
body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...
- 经典面试题:一张表区别DOM解析和SAX解析XML
============DOM解析 vs ...
- Dom4j解析和sax解析xml
xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析 3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...
- java解析XML之DOM解析和SAX解析(包含CDATA的问题)
Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...
- XML 解析---dom解析和sax解析
眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...
随机推荐
- 我叫mt3.0更新公告
1.增加卡牌: (1)炮姐,种族:牛头人,职业:元素萨满,可在任务中使用万能碎片兑换,最多兑换5张: (2)娘子,种族:德莱尼人,职业:治疗萨满,进化材料为死亡视察者: 详情点击查看>>& ...
- LeetCode.905-按奇偶排序数组(Sort Array By Parity)
这是悦乐书的第347次更新,第371篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第212题(顺位题号是905).给定一个非负整数数组A,返回一个由A的所有偶数元素组成的 ...
- C 语言实例 - 计算平均值
C 语言实例 - 计算平均值 C 语言实例 C 语言实例 使用数组来计算几个数的平均值. 实例 #include <stdio.h> int main() { int n, i; ], s ...
- idea下载
- cobian backup 11 使用
主机和备份机器创建备份用户(bf) 在备份机器上 设置备份用户, 备份目录右键安全,添加刚刚创建的备份bf用户,并授予所有权限 设置文件夹共享,并设置共享用户为刚刚创建的bf用户 并且在高级共享设置去 ...
- Qt 进程和线程之一:运行一个进程和进程间通信
Qt提供了对进程和线程的支持.本节讲述了怎样在Qt应用程序中启动一个进程,以及几种常用的进程间通信方法.如果对进程和线程的概念不是很了解,可以看我的另一篇博客:[多进程和多线程的概念. 设计应用程序时 ...
- js操作表格
js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法 表格有几行: var trCnt = table.rows.length ...
- 089 Gray Code 格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异.给定一个代表编码总位数的非负整数 n,打印格雷码序列.格雷码序列必须以0开头.例如, 给定 n = 2, 返回 [0,1,3 ...
- 103 Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行).例如:给定二叉树 [3,9,20,null,null,15,7], 3 ...
- mac Latex dvipdfm 缺少字体错误 Failed to read UCS2/UCS4 TrueType cmap
dvipdfmx 命令产生 ** ERROR ** Failed to read UCS2/UCS4 TrueType cmap... 错误的原因是没有把 simsun.ttf simkai.ttf ...