sax

sax_5分词条

saxsax

在采用DOM之后性能受到严重影响的情况下,使用Simple APIfor XML(SAX)。在用DOM耗费较长时间解析XML文件以后,你可能注意到在用DOM处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的:这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存。

 

目录 [隐藏]

sax 基本简介

       

saxsax
SAX最初是由DavidMegginson采用Java语言开发的,之后SAX很快在Java开发者中流行起来。SAN项目现在负责管理其原始API的开发工作,这是一种公开的、开放源代码软件。不同于其他大多数XML标准的是,SAX没有语言开发商必须遵守的标准SAX参考版本。因此,SAX的不同实现可能采用区别很大的接口。不过,所有的这些实现至少有一个特性是完全一样的,这就是事件驱动。

相当多的SAX实现都可以从网上获得。不幸的是,它们之间稍有不同,但其大多数都提供了相应的帮助文档。以下是一些流行的SAX实现:最“标准”的Java版本在SAX项目网站

MicrosoftXMLCoreServices4.0库包括了采用COM的SAX解析器,对VB程序员特别有用(或开发Windows的程序员)。

支持Perl的bindingofSAX2.0。

SAXinC++是一套用在SAX和C++应用程序中的C++接口和封装类。许多编程语言,比如Python和所有的.NET语言都在其核心功能中内建支持SAX。

sax 文档解析

       

saxsax
在SAX解析器装载XML文件时,它遍历文件文档并在其主机应用程序中产生事件(经由回调函数指派函数或者任何可调用平台完成这一功能)表示这一过程。这样,编写SAX应用程序就如同采用最现代的工具箱编写GUI程序。

大多数SAX实现都会产生以下若干类型的事件:

在文档的开始和结束时触发文档处理事件。
在文档内每一XML元素接受解析的前后触发元素事件。任何元数据通常都由单独的事件交付。
在处理文档的DTD或Schema时产生DTD或Schema事件。
错误事件用来通知主机应用程序解析错误。

显而易见,在处理文档时你最关心的就是元素事件了。通常,SAX解析器会向你的主机应用程序提供包含元素信息的事件参数;在最低程度下也会提供元素的名字。具体取决于你的特定实现,可以定义不同类型的元素事件代表不同类型元素的处理。例如,注释元素(它可能包含主机应用程序的处理指令)就经常在接受处理时产生特殊的事件。

sax 事件通知

       

假如把程序清单A中的XML文件装入了SAX解析器,那么你可能会在你的主机应用程序中收到以下事件通知:

saxsax
DocumentStart
ElementStart“catalog”
ElementStart“book”
ElementStart“author”
Data“Adams,Lamont”
ElementEnd“author”
ElementStart“title”
Data“Lamont'sFirstBook”
ElementEnd“title”
ElementEnd“book”
ElementEnd“catalog”
DocumentEnd

SAX对DOM,在什么情况下采用这种或者那种API并没有确定的严格规则;具体情况具体分析。所有的SAX处理都在一次遍历中完成的;因此,在解析同等大小的文档时SAX通常会相比DOM提供更好的性能(因为DOM必须遍历树结构)。此外,与DOM是比,因为在给定的时间之内只需要XML文档的一部分装入内存,所以SAX通常在处理更大文件时内存的利用效率也来得更高(DOM在开始解析文档之前必须把全部XML文档装入内存)。

SAX也不是没有缺点。SAX应用程序一般都比较长,程序中充斥着大量的if/else结构用来确定处理特定元素时所采用的运动。同样的,处理多个XML元素之间散布的数据结构也很成问题,因为解析事件之间必须保存中间数据。最后,SAX应用程序的事件处理结构一般意味着SAX应用程序是针对特定文件结构定制构建的,而DOM应用程序则更具一般性。

sax 解析实例

       

saxsax
在Java中使用XML是一个内容相当丰富的主题;可以使用多个API,而且许多API使得使用XML简单得如同从文本文档读取行。基于树的API(如DOM)展现了一个内存中的XML结构,该结构对于GUI和编辑器来说是最理想的,基于流的API(如SAX)对于只需要获取文档数据的高性能应用程序来说很重要。在本技巧文章系列中,将从基础知识开始一步步地教您如何在Java中使用XML。同时,您将学习许多甚至连众多专业人士都不知道的诀窍,所以即使您已经具有一些XML经验

从SAX(SimpleAPIforXML)开始。虽然该API或许是Java和XMLAPI中最难以掌握的,但它可能也是功能最强的API。另外,大多数其它API实现(象DOM解析器、JDOM和dom4j等)都部分地基于SAX解析器。对于用XML和Java语言所做的每一件事情,理解SAX会给予您一个良好的开端。特别在本篇技巧文章中,将讨论如何获取SAX解析器实例以及如何对该解析器设置一些基本功能和属性。

获取SAX解析器实例

//ObtainaninstanceofanXMLReaderimplementationfromasystemproperty
XMLReaderparser=org.xml.sax.helpers.XMLReaderFactory.createXMLReader();

通过使用这个方法,您需要将系统属性org.xml.sax.driver设置成想要装入的解析器的类名。这是特定于供应商的类;对于Xerces,它应该是org.apache.xerces.parsers.SAXParser。用-D开关将这个参数指定给Java编译器:

java-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParsersome.sample.Class

当然,您要确保指定的类存在并在类路径上。

sax 功能设置

       

saxsax
一旦有了解析器实例,就需要配置它。请注意,这与设置解析器来处理XML中的错误、内容或结构不同;相反,配置是实际告诉解析器如何操作的过程。您可以打开验证、关闭名称空间检查及扩展实体。这些行为完全独立于特定的XML文档,因此涉及与新解析器实例的交互。

注:对于那些过于急燥的人来说(知道您不是这样的),当然会处理内容、错误处理及类似的东西。然而,这些主题将在未来的技巧文章中讨论,所以您还得复查。眼下,只关注配置、功能和属性。

可以用两种方法配置解析器:功能和属性。功能包括打开或关闭特定功能,比如验证。属性包括设置解析器所使用的特定项的值,如用来验证所有文档的模式位置。将先讨论功能,然后在下一节研究属性

功能是通过解析器上名为setFeature()的方法设置的,这一点并不奇怪。

设置SAX解析器的功能

//ObtainaninstanceofanXMLReaderimplementationfromasystemproperty
XMLReaderparser=org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
StringfeatureName="somefeatureURI";
booleanfeatureOn=true;
try{
parser.setFeature(featureName,featureOn);
}catch(SAXNotRecognizedExceptione){
System.err.println("Unknownfeaturespecified:"+e.getMessage());
}catch(SAXNotSupportedExceptione){
System.err.println("Unsupportedfeaturespecified:"+e.getMessage());
}catch(SAXExceptione){
System.err.println("Errorinsettingfeature:"+e.getMessage());
}

这相当清楚,不需要说明;关键是知道可用于SAX解析器的常见功能。每个功能均由一个特定的URI标识。可以从SAX网站在线获得这些URI的完整列表。

sax 相关词条

       
MYSQL IP ICP ALEXA PR SEO
CGI FSO FTP POP3 WCM ECM
FLASH WEB GPU CPA DIV CSS
HTML BBS .NET XML AJAX MD5

 

 

 

sax 参考资料

       

1、http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipsaxp/#3
2、http://www.ibm.com/developerworks/cn/views/xml/tutorials.jsp?cv_doc_id=84979
3、http://www.builder.com.cn/2002/0613/50146.shtml

附图

上传图片 

互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于www.hudong.com

被引用: sax已被如下媒体引用 我来补充
互动百科联盟百科联盟 技术百科 新查找百科 阿里站长百科
开放分类: 我来补充
应用科学
技术
技能
网站
网站建设术语
网站术语
计算机技术
计算机科学
计算机编程

讨论区

更多>>

编辑者

共5人协作

相关词条

入侵检测
java名词 解释
Windows 95
PB
IPv6
Java Development Kit
Java开发包
DB2数据库
注册表
XML
更多

所属任务

Copyright © 2005-2009 hudong.com Ltd. All Rights Reserved. 互动在线 版权所有