SAX 解析xml的处理机制

转载:http://blog.sina.com.cn/s/blog_5de48f8b0100dbtp.html 
昨天我们学习了使用 DOM 解析 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 


你可能感兴趣的:(SAX 解析xml的处理机制)