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解析的更多相关文章

  1. java拾遗2----XML解析(二) SAX解析

    XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...

  2. Java SE之XML<二>XML DOM与SAX解析

    [文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...

  3. Android XML文档解析(一)——SAX解析

    ---------------------------------------------------------------------------------------------------- ...

  4. Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)

    1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...

  5. XML.03-DOM和SAX解析

    body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...

  6. 经典面试题:一张表区别DOM解析和SAX解析XML

                                                                                 ============DOM解析    vs ...

  7. Dom4j解析和sax解析xml

    xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析  3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...

  8. java解析XML之DOM解析和SAX解析(包含CDATA的问题)

    Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...

  9. XML 解析---dom解析和sax解析

    眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...

随机推荐

  1. laravel SQL语句

    DB::table('表名')->get();   //查询表里的所有数据 DB::table('表名')->where()->find(需要查询的条数);    查询单或多条数据 ...

  2. bzoj3771: Triple(容斥+生成函数+FFT)

    传送门 咳咳忘了容斥了-- 设\(A(x)\)为斧头的生成函数,其中第\(x^i\)项的系数为价值为\(i\)的斧头个数,那么\(A(x)+A^2(x)+A^3(x)\)就是答案(于是信心满满的打了一 ...

  3. IT兄弟连 JavaWeb教程 JSP内置对象2

    application对象 application对象用于保存所有应用程序中的公有数据.它在服务器启动时自动创建,在服务器关闭时销毁,当application对象没有被销毁时,所有用户都可以共享app ...

  4. XHTML学习笔记 Part4:列表

    1. 空格 如果在两个单词中间放置几个连续的空格,默认情况下只会显示一个空格,这种情况成为空格折叠.同样,如果在源文档中开始一个新行,或者放置多个连续的空行,则这些新行将被忽略并被处理为一个空格.对制 ...

  5. GitHub使用方法(初级)

    [初识Github] Git 是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目 ...

  6. 【TeamViewer】v13.2.26558版本 修改ID

    TeamViewer是一款远程协作软件,可以让你在一台机器上操作另一台机器.比如我最近就经常在家里连接公司的电脑进行远程工作.可以说是对于程序员很好用的一个软件. TeamViewer 使用频繁后会被 ...

  7. P3809【模板】后缀排序

    传送门 深入理解了一波后缀数组,这东西真的很妙诶,自己推感觉完全不现实,看来只能靠背代码了 这段时间就多敲敲,把板子记熟吧 代码: #include<cstdio> #include< ...

  8. iOS 更改状态栏、导航栏颜色的几种方法

    ios上状态栏 就是指的最上面的20像素高的部分状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分:背景部分:就是显示黑色或者图片的背景部分: (一)设置sta ...

  9. UWP 切换语言

    关于UWP切换语言的具体可以看这篇.http://www.cnblogs.com/hupo376787/p/7775291.html 这里我就记录一些自己的. 目前大多数软件用的都是利用文本资源文件来 ...

  10. Codeforces Round #390 (Div. 2) D

    All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring s ...