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 事件驱动编程步骤
- 主循环监听事件的发生
- 主循环检测到一个事件发生,触发回调函数
2.2 编写事件驱动程序
- 第一步:写一个系列的子程序(方法),称为事件处理程序。这些例程处理主程序将要响应的事件。许多现代编程环境为程序员提供了事件模板,使程序员可以专注于编写事件代码。
- 第二步:将事件处理程序绑定到事件,以便在事件发生时调用正确的函数。
- 第三步:编写主循环。这是一个函数,检查事件的发生,然后调用匹配的事件处理程序来处理它。
3.用SAX进行XML处理
<?xml version="1.0" encoding="UTF-8"?>
<DocumentElement param="value">
<FirstElement>
¶ 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技巧
上一篇: 网管转身变“黑客”,企业该怎么保护自身的数据资产?
下一篇: Facebook 一亿用户信息遭曝光