随着 Web 服务和面向服务架构(SOA)的出现,XML 已变得非常流行。它对于应用程序之间和 Web 上的数据交换起着非常重要的作用,并且是许多性能关键型场景的基础。
|
您可以通过有效地使用解析器提高 XML 应用程序的性能。Xerces-C++ 是可从 Apache 获得的开放源码 XML 验证解析器。本文将展示许多利用 Xerces-C++ 解析器提高应用程序性能的技巧。
Xerces-C++ 是一个作为共享库提供的 XML 验证解析器。这个库包含针对 DOM 和 SAX 的接口。具体地说,SAXParser 是针对 SAX 1.0 规范的接口:SAX2XMLReader 是针对 SAX 2.0 规范的接口;XercesDOMParser 是针对 DOM 规范的接口;DOMBuilder 是 DOM Level 3.0 Abstract Schemas and Load and Save 规范的 Load 接口的一个实现。
许多属性和特性对解析器的性能都有很大的影响。
Xerces-C++ 的主要组件之一是扫描程序。它不只负责扫描 XML 实例,而且在评定 XML 文档的有效性方面起着重要作用。
Xerces-C++ 有四个扫描程序:IGXMLScanner、WFXMLScanner、DGXMLScanner 和 SGXMLScanner。为您的场景选择合适的扫描程序对于获得更好的性能非常重要。IGXMLScanner(默认的扫描程序)是一个通用的扫描程序,它不仅处理格式是否良好,而且针对 DTD 和/或 XML Schema 验证 XML 文档。另一方面,WFXMLScanner 只负责检查格式是否良好而不进行语法验证。如果您只关注文档的格式良好性就使用 WFXMLScanner。如果只进行 DTD 验证就使用 DGXMLScanner,如果只进行 XML Schema 验证就使用 SGXMLScanner。
通过在 SAX2XMLReader API 或 DOMBuilder API 中设置扫描程序属性,可以通知解析器使用哪个扫描程序。清单 1 说明如何在 SAX2XMLReader 上设置扫描程序。
清单 1. 在 SAX2XMLReader API 上设置扫描程序 #include <xercesc/internal/XMLGrammarPoolImpl.hpp> #include <xercesc/sax2/XMLReaderFactory.hpp> #include <xercesc/util/XMLUni.hpp> XMLGrammarPool *grammarPool = new XMLGrammarPoolImpl(XMLPlatformUtils::fgMemoryManager); SAX2XMLReader* parser = XMLReaderFactory::createXMLReader( XMLPlatformUtils::fgMemoryManager, grammarPool); parser->setProperty(XMLUni::fgXercesScannerName, (void *)XMLUni::fgSGXMLScanner); |
对 SAXParser API 或 XercesDOMParser API,您可以调用 useScanner
方法来指定解析器应该使用哪个扫描程序,如
本文转自IBM Developerworks中国