使用支持通信服务框架的Xerces

  本应用注释即将讨论的是Dialogic之通信服务框架(CSF)的一个新组件。CSF是一个开放源代码软件套件,可以帮助开发商更轻松地开发支持Dialogic® NetStructure®板卡的高级应用和Dialogic® NetStructure®主机媒体处理(HMP)软件。CSF为开发商提供了一个高级的、面向对象的界面,该界面将大部分本地接口进行了抽象,可以便于迅速展开分布式电信应用的开发工作。

  可扩展标记语言(XML)是一种广泛被接受的编码标准,主要用于编写文本文件结构化信息的代码。我们建议您使用支持CSF的Xerces开放源代码XML域对象模式(DOM)解析器,它可以帮助您极其轻松地完成许多任务。如操作本地配置文件,或者解译来自web服务器、影响到通信应用操作的XML数据。

  本应用注释将就CSF和解析器之间的接口进行详细说明,以提供运行Xerces XML演示程序的方法。

  Xerces开放源代码XML解析器是Apache XML项目()XML项目组的一个组成部分。过去几年,它们在面向web和其它类型的应用中已得到广泛的应用。电话应用也不例外。VoiceXML解译器OpenVXI就使用Xerces作为其核心技术。呼叫控制协议,如会话发起协议(SIP)也使用XML来控制和传输数据。

  Dialogic的通信服务框架(CSF)也从使用XML工具中获益巨大。本应用注释具体讲述的就是如何将Xerces DOM解析器集成至CSF中,以及如何在简单的测试程序中使用Xerces DOM解析器。本文阐述的原则即是要帮助读者全面地使用Xerces DOM,以便于他们更好地构建其各自的CSF应用。

  最初的XML集成一般选用的是XML DOM模式,而不是XML的简单API(SAX)模式。虽然不如SAX那样高效,但是这种结构化更明显的DOM模式却可以提供更可行的两步流程。XML文件首先被解析成一个树型结构。任何的语法错误均会在此时被标记出来。树型结构建成之后,数据收集程序就开始遍历该树型结构,将需要的数据取出来,放在应用指定的数据结构中。

  详细参阅《通信服务框架(CSF)介绍》。如欲获得连接至其它CSF主题的链接地址,请访问:。

  Xerces DOM解析器对象的类层次结构非常类似于其它CSF电话网络、数据通信或语音设备。抽象的DOM解析器设备包括实施任何类似解析器的有用状态信息和基本数据及方法。具体的XercesDOMParser类出自于抽象类,并提供了针对特定Xerces解析器的具体方法和数据。其它类似的DOM解析器如果添加到CSF,也可以基于同样的抽象类进行构建。图1详细描述了该类层次结构。

  Xerces DOM解析器是CSF中的一个有状态的实体,非常类似于通信或语音设备。相对而言,它更为简单,因为它不是异步的。所以它的状态种类更少。例如,它不需正在进行状态。此外,由于本身是同步的,所以它也不需使用CSF命令对象。命令对象与异步命令搭配使用时可发挥出色的运行效果,但是除非应用逻辑完全受同一队列的事件/命令的驱使,否则很容易出现顺序问题。这样就有可能需要为同步命令如Xerces解析创建一个完成事件(completion event)。而且如果要为CSF添加其它采用异步模式的XML解析器,那么可能也会出现上述结果。所以这个时候,我们采取了相对简单的同步方法。

  完成DOM树结构扫描后,即可发布扫描结果,解析器对象返回打开状态,以便进行另外的XML解析。

  Xerces DOM解析器是CSF池化对象。CPoolObj类是一个C++模板,可以将对象存放在可扩展对象池中,这些对象都已经过初始化、可以随时使用。当使用GetAvailable()方法向池请求一个对象时,会首先搜索一个对象的向量以查找是否有未使用的条目。如果找到,对象就会被返回。否则就将创建新的对象。当不再需要对象时,就可以通过Release()方法将其返回池中,以供日后使用。这样可以节省运行时期间删除和初始化对象的成本。

  池化运算还须考虑到对象的状态变化。每个新对象被创建后,它必定会进入打开状态。对象释放后,又必定会回到打开状态。最后,当应用被关闭后,池还需要清空,池中的对象也必须全部删除。

  XML文件完成解析后,会有两个数据收集类来遍历DOM树结构,以提取所需要的数据。

  第一组类仅仅概况性地表述STL容器――列表――即用来存储已解析数据的容器。具体的容器类源自于抽象的基础类。

  AparsedValueContainer类没有数据和方法。它仅用于配合收集程序类的运行。(见图3。)抽象收集程序类纯虚拟功能CollectValues()的第二个影响因素是容器,当在具体收集程序类实施中定义了容器时,必须使用通用的基础类。所以在真正使用容器之前,必须在每个具体的收集程序类中进行向下类型转换。

  对STL容器列表的访问还将受到Boost范围锁的保护。测试程序只是顺序访问每个列表――在收集程序类中添加数据,然后等列表构建完成后,在列表上循环记录变量值。但是其它未来的使用方法或许能够并发访问列表。因此锁的使用十分必要。

  第二个必要的类是收集程序类。它源自于抽象类,不过这些抽象类仅用于命名纯虚拟方法CollectValues,每个具体的类中均必须有这一命名。图4表示的是测试应用中所使用的收集程序类。

  具体类中的CollectValues方法负责定义每个具体XML文件图解的DOM树遍历。它们都知道每个XML文件中找到的DOM组件与属性的名称,以及存放变量值所需要的STL容器类。通过递归呼叫(recursive call)的使用,它们可以遍历DOM树结构并传输Xerces方法返回的属性,然后存储至容器。

  它由三个要素组成――CSFConfig、CONFDEVICES和ConfDevEntry。前两个要素只用于为解析和数据收集过程中的每个ConfDevEntry提供环境。CONFDEVICES要素用于确定值所驻留的STL容器,容器(CONFDEVICELIST)的每个节点都包含一个对象,对象的成员变量名称类似于XML文件中的属性名称――如ConfType、ConfDevice、Info1等等。成员变量的值将为属性的值――DCB、dcbB1D1、及空值。

  现在我们已经了解了从XML到应用指定数据容器的整个过程,但读者在将Xerces DOM解析器类用于自己的XML文件上时,还须注意一点。

  对于任何新的XML文件定义,只需要编写一个描述容器类的对象即可,然后再编写一个具体的类,以接收从已解析DOM树结构传输的数据。

  在定义一个新XML图解时,我们建议首先使用Mozilla*或Microsoft Internet Explorer*等网络浏览器检查一下文件的语法。浏览器能够以更清晰的视图显示文件的语法,而且更重要的是,浏览器还可以提供语法错误讯息,并在XML文件中相应的地方指示出来。

  基本Xerces解析器和数据收集程序类还带有一个测试应用样本。它能够执行两类XML文件测试。第一个是对两个不同XML文件进行单线程、重复解析。它将验证和解析XML文件的语法,并将结果传输至应用定义的STL容器。然后再使用CSF的日志系统显示容器的组成内容。

  第二个测试是多线程的解析器负载测试。应用将启动四个线程。然后这些线程再初始化多个解析器,以便同时通过相同的解析顺序进行解析。这样可以验证多个解析器是否可以同时在同一个系统上使用,以及负载测试的实用性。当延期运行时,负载测试也可以用于检查是否存在内存或其它系统资源泄漏。

  如果测试应用在多线程模式中运行,则有必要将CSF日志级别下降到ERROR。在完全DEBUG级别上运行会产生大量日志输出,事件日志线程和应用控制台窗口也不能与解析器保持同步。提高内存容量可以缓冲需要记录的数据。在运行应用前,应该在CSF Xerces目录中的log4cplus.properties文件中进行上述调整。

  此处不介绍完整的CSF系统设置。如欲了解详细信息,请参见如欲了解更多信息部分中的CSF参考(第6页)。使用Xerces时无需考虑特别的事项,仅完成安装Xerces软件安装即可。如果要同时使用CSF,您必须从Source Forge上CSF项目处下载CSF 0.7.0或更高版本。该项目的网址为:。

  无论是哪种操作系统,在构建应用之前,您需要在Xerces目录下的CDomParserObjApp.h头文件顶部的几个#define进行设置。

  完成以上参数设置之后,Visual C++ CSF/Xerces解析器测试应用项目就将能够定位Xerces组件。

  Visual C++ 6.0用于构建CSF和解析器测试应用。该项目可被包含于整体CSF工作空间,该项目本身(Dom解析器Obj.dsp)也可以与Visual C++同时运行。

  如欲同时使用CSF,您需要设置几个环境变量。首先,将XERCES_ROOT设置为完全路径,直通顶层Xerces目录。(这与用于构建Xerces库本身的XERCESCROOT的值相同。)例如:

  DomParserObj应用完成构建之后,它就可以在任何操作系统的命令行处开始运行。

  您可以在终端窗口中看到调试或错误日志信息,这些信息的位置为CSF Xerces目录下的test.log文件。您可以看到XML文件每个重要要素的属性名称和值。

相关阅读