使用Xerces-J的SAX方式进行XML程序设计

--C++/Perl语言的Xerces简介


Xerces还提供C++和Perl版本的解析器。目前C++版本的Xerces最高版本也为1.3,Perl的最高版本为1.0。

Xerces的C++版本又称为Xerces-C,是一个具有校验功能的XML解析器。目前,Xerces-C支持XML1.0 recommendation及相关的以下标准:DOM 1.0,,SAX 1.0, SAX 2.0, Namespaces, DOM Level 2 version 1.0。我们可以从http://xml.apache.org免费获得Xerces-C的编译好的二进制代码,源代码和文档。同Xerces-J相比,Xerces-C的性能高,但是支持的平台相对较少。目前,Xerces-C支持的平台有Win32,Linux 6.1/libc 2.1.2-11,Solaris,AIX 4.2.1,HP-UX 11,OS390,AS400,SGI IRIX, Macintosh,,OS/2,PTX。尽管无法同Java的跨平台性能相比,但是相对MSXML已经有很自由的跨平台性了,不过不知为什么没有FreeBSD/NetBSD的版本。

下面的一段程序是随Xerces-C提供的,演示了如何使用Xerces-C进行程序设计。

int main (int argc, char* args[]) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { cout << "Error during initialization! :\n" << toCatch.getMessage() << "\n"; return 1; } char* xmlFile = "x1.xml"; SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); parser->setFeature(XMLString::transcode("http://xml.org/sax/features/validation", true) // optional parser->setFeature(XMLString::transcode("http://xml.org/sax/features/namespaces", true) // optional ContentHandler* contentHandler = new DefaultHandler(); ErrorHandler* errHandler = (ErrorHandler*) contentHandler; parser->setContentHandler(docHandler); parser->setErrorHandler(errHandler); try { parser->parse(xmlFile); } catch (const XMLException& toCatch) { cout << "\nFile not found: '" << xmlFile << "'\n" << "Exception message is: \n" << toCatch.getMessage() << "\n" ; return -1; } }

Xerces的Perl版本目前提供了DOM.pm和DOMPARSE.pm两个模块,提供了进行DOM解析所需要的接口,我们会在介绍了Xerces-J的DOM解析器后进行介绍。目前,Perl语言的SAX接口是由Jams Clark(http://www.jclark.com )写的XML::Parser模块提供的。这个模块的内核是由一个C语言的外部库(expat)来提供的,由于SAX的解析过程存在大量的函数或者回调函数调用,在从C到Perl的函数调用转换过程会花费大量的时间,因此在效率上存在些问题。Perl 5.8本来可能会用Perl语言重新写一个解析器,但是很多人坚持“不需要重新发明车轮子”,因此目前短期内可能不会有一个标准的,随Perl一起发布的XML解析器。目前,Perl开发者似乎在很大程度上同意应该彻底用C/C++写一个DOM解析器,这样在解析过程中不需要有很多的C/Perl之间的函数调用,从而提高性能。根据在上面进行的分析,使用Xerces提供的DOM模块可以避免性能上的麻烦。但是同hash表一样,DOM在解析大型的XML文件时可能消耗掉巨大的内存,若是mod-perl影响可能会更大,同样会造成巨大的性能损失,因此,在Perl语言在选择解析器的时候要根据XML文件的大小适当地选择解析器。