在古代,Xerces(Xerxes)是波斯王朝的统治者。如今,Xerces作为Apache项目回答了这个问题:“如何解析XML文档?”。尽管被认为是一个Java平台,Xerces项目实际上发布Java和C++两种版本的解析器。Xerces-C++为不能用Java的环境或非Java开发平台提供了解决方案。
Xerces-C++像是二合一的解析器。它的包支持文档对象模型(DOM)和XML简单应用编程接口(SAX)。允许你挑选使用任意的解析方式,更好的满足自己的需求。两种解析器分别被指定为Xerces-C++ DOM和Xerces-C++ SAX。以DOM的方式解析,看待每个XML文档为一个对象;然而以SAX的方式,看待XML文档为一系列的事件。Xerces支持SAX和SAX2的功能。
包含类的API
Xerces-C++实际上提供一套类。这些类被设计成提供API(应用编程接口),优于可以扩展的基础类。类的结构非常简单。最复杂的继承层次围绕着DOM的类,它提供了XML文档的各种组成(像元素和实体)的表示对象。
Xerces同时提供了DOM和SAX,因此他们在分列类时有各自的方式。有三种文档类型处理器承担实际的解析工作。对于DOM解析,他们是DOMParser和IDOMParser;对于SAX解析,有SAXParser。实例化他们其中一个引擎是解析XML文档的第一步。例如,下面的代码片段举例如何构造新的DOMParser对象,解析器指向它。
DOMParser* parser = new DOMParser;
创建SAXParser同样简单:
SAXParser* parser = new SAXParser;
一旦解析器被创建,你可以设置一把选项,它们影响XML解析器的行为。你可以选择开启确认检查的选项来验证XML文档是否符合特定的模式。你也可以选择验证XML文档里的名字空间。
IDOMParser是新的DOM解析器的实现。对于现阶段的Xerces,IDOM还处于试验状态。新的实现使得DOM解析器更快更有效。它不像是Xerces的Java DOM解析器的一部分,而更像是一个真正的C++ DOM解析器。
获取数据
使用Xerces创建新的解析器不麻烦,并且获取信息同样简单。对于DOM解析器而言,创建解析器并处理XML数据的结果将产生DOM文档。这个类把解析后的XML文档表现为一个C++类的版本,你可以查询,修改和序列化它(使用XMLFormatter类)。
使用SAX解析器获取数据有点不同。代替解析整个XML文档得到对象模型的是,SAX使用事件和方法回调。在XML文档中的每个节点表示为一个SAX事件(像开始标签或结束标签)。为了处理文档,你新建一个DocumentHandler类的实现。你的文档处理器必须实现SAX解析器将要为XML文档中不同的事件调用的各种方法。例如,你的DocumentHandler类中的endElement()方法,当end-element事件发生时随时被SAX解析器调用。SAX解析器通过注册的过程知道如何调用你的处理器。下面是使用SAX解析器时,如何注册你的处理器的一个例子:
SAXParser* parser = new SAXParser;
MySAXHandlerClass handler;
parser->setDocumentHandler(&handler);
一旦你的文档处理器在SAX解析器中被注册,你就可以调用解析器的parse()方法。这将开始为文档处理器的各种处理方法传送事件的过程。
总结
像其它所有Apache项目一样,Xerces-C++ XML解析器也在不断的发展。当开发者面临提供XML的解决方案,而平台没有Java可选(或者可能不是首选)的时候,将享受到Xerces提供的强大引擎的乐趣。点击这里找出更多关于Xerces-C++的信息,下载工具包,在线浏览APIs。