SAX介绍
用于读取和操作XML文件的标准是文档对象模型(Document Object Model,DOM)。遗憾的是,DOM方法涉及读取整个文件并将该文件存储在一个树结构中,而这样可能是低效的、缓慢的,并且很消耗资源。一种替代技术就是Simple API for XML,或称为SAX,翻译过来的意思是简易应用程序编写接口。SAX允许在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。
SAX没有官方的标准机构;它不由万维网联盟(Wide Web Consortium,W3C)或其他任何官方机构维护,但它是XML社区事实上的标准。在XML中对SAX的应用丝毫不比DOM少,几乎所有的XML解析器都会支持它。与DOM比较而言,SAX是一种轻量型的方法。SAX最初是由David Megginson采用Java语言开发的,之后SAX在Java开发者中流行起来。SAN项目现在负责管理其原始API的开发工作,这是一种公开的、开放源代码软件。现在它已经被改写成其他语言,如C#等。
不同于其他大多数XML标准的是,SAX没有语言开发商必须遵守的标准SAX参考版本。因此,SAX的不同实现可能采用区别很大的接口。不过,所有的这些实现至少有一个特性是完全一样
的,这就是事件驱动。但是现在我们将仅提及它最显著的一个特性:SAX不属于任何标准组织或团体,也不属于任何公司或个人;它是供任何人实现与使用的一种计算机技术。尤其与大多数XML标准族的不同之处在于,SAX和W3C组织没有任何关系。
SAX是一个基于事件的API。基于SAX的解析器向一个事件处理程序发送事件,比如元素开始和元素结束,而事件处理器则处理该信息。然后应用程序本身就能够处理该数据。原始的文档仍然保留完好无损,但是SAX提供了操作数据的手段,而后数据可以引入另一个进程或文档。
SAX是一种简易的API接口,实现了该接口后,可以用来读取XML文件的信息。SAX具有下面优点:xml实体解析xpath注入
● 可以解析任意大小的文件 因为SAX不需要把整个文件加载到内存,所以对内存的占用一般比DOM小得多,而且不会随着文件大小的增加而增加。当然DOM使用的实际内存数量要视解析器而定,但在大多数情况下一个100Kb的文档至少要占用1Mb的内存。但是有一点要注意:如果SAX应用程序自身在内存中创建文档的表达,它会占用和允许解析器创建空间一样大小的内存。
● 适合创建自己的数据结构 应用程序可能会想用如书、作者以及出版社这样的高级对象而不是一些低级元素、属性和处理指令来创建数据结构。这些“交易对象”可能只是和XML文件内容有一点关系;例如它们可能只是组合XML文件和其他数据源的数据。在这种情况下,如果想在内存中创建面向应用的数据结构,首先创建一个低级DOM结构然后毁坏它是很不合算的。而SAX可以仅在每个事件发生时处理这些数据,这样保证商务对象模型合理地增加变动。
● 适合小信息子集 如果仅对XML文档部分数据感兴趣,那么把全部数据和需要的少量数据一起读入内存是非常低效和不必要的,只需要对自己要用到的读取过来。SAX一个非常好的特点就是可以非常容易地忽略不感兴趣的数据信息。
● 简单 SAX非常易于使用,SAX基于事件模型的,使类的层次和结构非常明显。
● 快速 如果可以从经由文档的简单序列中获取XML信息,SAX几乎一定是最快的方法。SAX是一种简易的接口,能够非常快速的获取数据。
SAX有两个版本,SAX 1.0 和SAX 2.0。SAX 2.0相比较于1.0,处理的元素和属性扩展为支
持名称空间;加载和分析XML文档的过程发生了改变。还提供了检索和设置分析程序属性和功能的方法,例如分析程序是否可以进行有效性验证等。现在主要使用2.0版本。
SAX的缺点是必须实现处理所有事件的事件处理程序。必须在应用程序代码中维护这个事件状态。因为SAX解析器不能交流元信息,如DOM的父/子支持,所以我们必须跟踪解析器处在文档层次的哪个位置。这样,文档越复杂,应用逻辑就越复杂。虽然没有必要一次将整个文档加载到内存中,但SAX解析器仍然需要解析整个文档,这点和DOM一样。
SAX面临的最大问题是它没有内置如XPath所提供的那样的导航支持。再加上它的单遍解析,这就意味着它不支持随机访问。这个限制也表现在名字空间上:对有继承名字空间的元素也不做注解。这些限制使SAX很少被选择用于操作或修改文档。
那些只需要单遍读取内容的应用程序可以从SAX解析中大大受益。很多B2B和EAI应用程序将XML用作封装格式,接收端用这种格式简单地接收所有数据。这就是SAX明显优于DOM的地方,前者高效因而获得的高吞吐率。SAX 2.0有一个内置的过滤机制,可以很轻松地输出一个文档子集或进行简单的文档转换。最后,SAX解析对根据DTD和XML Schema进行确认非常有用。实际上,Oracle在内部使用SAX解析器来完成这种确认,比起DOM来使用更少的
内存并获得更高的效率。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论