欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POI事件模式解析Excel 2007(二) - SAX简介

程序员文章站 2022-06-16 15:21:23
...

1.概述

  • SAX官方网站,它取代了David Megginson的原始SAX官网
  • SAX (Simple API for XML)是一种采用事件驱动编程(Event-driven programming)在线算法(Online algorithm)替代文档对象模型(DOM)的解析XML的算法。
  • DOM 要求在处理过程中整个文档都加载到内存中,把整个XML文档以一棵DOM树的形式存放在内存中。通过DOM树,应用程序可以对XML文档进行随机访问,但是当XML文档比较大或者文档结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项比较耗时的操作
  • 不同于DOM解析,SAX提供了一种从XML文档中读取数据的机制。它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。

2.事件驱动编程

在事件驱动的应用程序中,通常有一个主循环用于侦听事件,大多数事件驱动的编程环境已经提供了这个主循环,所以它不需要由应用程序员专门提供。

2.1 事件驱动编程步骤

  1. 主循环监听事件的发生
  2. 主循环检测到一个事件发生,触发回调函数

POI事件模式解析Excel 2007(二) - SAX简介

2.2 编写事件驱动程序

  1. 第一步:写一个系列的子程序(方法),称为事件处理程序。这些例程处理主程序将要响应的事件。许多现代编程环境为程序员提供了事件模板,使程序员可以专注于编写事件代码。
  2. 第二步:将事件处理程序绑定到事件,以便在事件发生时调用正确的函数。
  3. 第三步:编写主循环。这是一个函数,检查事件的发生,然后调用匹配的事件处理程序来处理它。

3.用SAX进行XML处理

 <?xml version="1.0" encoding="UTF-8"?>
 <DocumentElement param="value">
     <FirstElement>
         &#xb6; Some Text
     </FirstElement>
     <SecondElement param2="something">
         Pre-Text <Inline>Inlined text</Inline> Post-text.
     </SecondElement>
</DocumentElement>

请注意,上面的示例的第一行是XML声明,而不是处理指令; 因此不会将其作为处理指令事件进行报告(尽管一些SAX实现为XML声明提供了单独的事件)。

上述结果可能会有所不同:SAX规范故意指出,给定的文本段可能会被报告为多个连续的文本事件。例如,许多解析器为数字字符引用返回单独的文本事件。因此,在上面的例子中,SAX解析器可能会生成一系列不同的事件,其中一部分可能包括:

XML元素开始,名为FirstElement
XML文本节点,数据等于“&#xb6;” (Unicode字符U + 00b6)
XML文本节点,数据等于“Some Text”
XML元素结束,名为FirstElement

4.优点

  • SAX最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档
  • 无需像在DOM中那样为所有节点创建对象
  • SAX“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。

5.缺点

  • 几乎任何类型的XML验证都需要完整地访问文档。

  • 必须实现多个事件处理程序以便能够处理所有到来的事件,同时必须在应用程序代码中维护这个事件状态,因为SAX解析器不能交流元信息,如DOM的父/子支持,所以你必须跟踪解析器处在文档层次的哪个位置。如此一来,你的文档越复杂,你的应用逻辑就越复杂。虽然没有必要一次将整个文档加载到内存中,但SAX解析器仍然需要解析整个文档,这点和DOM一样

  • 没有内置如XSLT和XPath所提供的那些导航支持。再加上它的单遍解析,使它不能支持随机访问

6.十大SAX2技巧

十大SAX2技巧