`

使用 SAX 解析 XML 文档

阅读更多
使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,然后在内存中创建 DOM 树,生成 DOM 树上的每个节点对象,只有在整个 DOM 树创建完成后,才能做需要的修改操作,即使是只需要修改根元素节点的第一个子节点。当 XML 文档较大时,构建 DOM 树将花大量的时间和内存。SAX 允许在读取文档的时候,即对文档进行处理,解析完毕也就处理完成了,不必等到整个文档被分析储存之后才进行操作。

1. SAX 的处理机制
<1> SAX 是一种基于事件驱动的 API 。
<2> 利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:
a. 解析器负责读取 XML 文档,并向事件处理器发送事件。
b. 事件处理器负责对事件做出相应,对传递的 XML 数据进行处理。

2. 解析器 — XMLReader 接口
<1> SAX 解析器接口和事件处理器接口在 org.xml.sax 包中定义。
<2> XMLReader 接口是 SAX 2.0 解析器必须实现的接口。该接口允许应用程序设置和查询解析器的功能和特性,注册处理文档的事件处理器,以及启动文档的解析。
<3> XML 解析器提供商负责提供实现 XMLReader 接口的解析器类。

3. 事件处理器 ---- ContentHander 接口
<1> SAX API 定义了许多事件,这些事件分别由事件处理器中的相应方法去响应。
<2> 如果应用程序要获得基本的解析事件,需要实现 ContentHandler(内容事件处理器) 接口,并使用 XMLReader 对象的 setContentHeader() 方法向解析器注册一个ContentHandler实例。解析器使用这个实例来报告与文档相关的基本事件。如:元素的开始和结束等。
<3> 在 ContentHandler 接口中,事件的顺序反映了文档自身信息的顺序。如:元素的所有内容(字符数据,子元素) 都将依次在 startElement 事件和 endElement 事件之间出现。

4. ContentHander 的主要方法
Void startDocument()
Void endDocument()
Void startElement(String uri, String localName, String qName, Attributes attrs)
Void end Element(String uri, String localName, String qName)
Void characters(char [] ch, int start, int length):该方法接收字符数据的通知。解析器调用这个方法来报告字符数据块。为了提高解析效率, SAX 解析器会把读取到的所有字符都放在一个字符数组中,通过 ch 参数传递给 characters 方法,在该方法中,若想获取本次字符数据事件中读到的字符数据,需要使用 start 和 length 参数。
为了简化程序的编写,在 org.xml.sax.helpers 包中提供了一个帮助类 DefaultHandler, 它实现了

ContentHandler, DTDHandler 等 4 个接口,在应用程序中只需要编写从 DefaultHandler 继承的子类,然后更新需要重写相应的方法即可。

5. SAX 解析工厂
<1> 与 DOM 类似,JAXP 也为 SAX 解析器提供了工厂类: SAXParserFactory 类。
<2> JAXP 中定义的 SAX 解析器类是 SAXParser. SAXParser 类是 XMLReader 实现类的一个包装类。
<3> 可以调用 SAXParser 中的 parse() 方法来解析 XML 文档。

6. 下面是运用 SAX 解析 XML 文件的步骤和代码:

SAXParserFactory factory = null;

//1. 得到 SAXParserFactory 的实例
factory = SAXParserFactory.newInstance();

//2. 得到 SAXParser 解析器对象

SAXParser parser = factory.newSAXParser();
DefaultHandler handler = null;
handler = new MyDefaultHandler();

//3. 利用 SAX 解析 XML 文档,并且向解析器注册一个事件监听器

parser.parse(new File("cities.xml"), handler);

class MyDefaultHandler extends DefaultHandler() {

// 常用的事件监听器事件有: characters; endDocument; endElement

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics