sax |
在采用DOM之后性能受到严重影响的情况下,使用Simple APIfor XML(SAX)。在用DOM耗费较长时间解析XML文件以后,你可能注意到在用DOM处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的:这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存。
基本简介编辑本段回目录
sax |
相当多的SAX实现都可以从网上获得。不幸的是,它们之间稍有不同,但其大多数都提供了相应的帮助文档。以下是一些流行的SAX实现:最“标准”的Java版本在SAX项目网站。
MicrosoftXMLCoreServices4.0库包括了采用COM的SAX解析器,对VB程序员特别有用(或开发Windows的程序员)。
支持Perl的bindingofSAX2.0。
SAXinC++是一套用在SAX和C++应用程序中的C++接口和封装类。许多编程语言,比如Python和所有的.NET语言都在其核心功能中内建支持SAX。
文档解析编辑本段回目录
sax |
大多数SAX实现都会产生以下若干类型的事件:
在文档的开始和结束时触发文档处理事件。
在文档内每一XML元素接受解析的前后触发元素事件。任何元数据通常都由单独的事件交付。
在处理文档的DTD或Schema时产生DTD或Schema事件。
错误事件用来通知主机应用程序解析错误。
显而易见,在处理文档时你最关心的就是元素事件了。通常,SAX解析器会向你的主机应用程序提供包含元素信息的事件参数;在最低程度下也会提供元素的名字。具体取决于你的特定实现,可以定义不同类型的元素事件代表不同类型元素的处理。例如,注释元素(它可能包含主机应用程序的处理指令)就经常在接受处理时产生特殊的事件。
事件通知编辑本段回目录
假如把程序清单A中的XML文件装入了SAX解析器,那么你可能会在你的主机应用程序中收到以下事件通知:
sax |
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 |
从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 |
注:对于那些过于急燥的人来说(知道您不是这样的),当然会处理内容、错误处理及类似的东西。然而,这些主题将在未来的技巧文章中讨论,所以您还得复查。眼下,只关注配置、功能和属性。
可以用两种方法配置解析器:功能和属性。功能包括打开或关闭特定功能,比如验证。属性包括设置解析器所使用的特定项的值,如用来验证所有文档的模式位置。将先讨论功能,然后在下一节研究属性。
功能是通过解析器上名为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的完整列表。
相关词条编辑本段回目录
MYSQL | IP | ICP | ALEXA | PR | SEO |
CGI | FSO | FTP | POP3 | WCM | ECM |
FLASH | WEB | GPU | CPA | DIV | CSS |
HTML | BBS | .NET | XML | AJAX | MD5 |