要點(diǎn)綜述
本應用注釋即將討論的是Dialogic之通信服務(wù)框架(CSF)的一個(gè)新組件。CSF是一個(gè)開(kāi)放源代碼軟件套件,可以幫助開(kāi)發(fā)商更輕松地開(kāi)發(fā)支持Dialogic®
NetStructure®板卡的高級應用和Dialogic®
NetStructure®主機媒體處理(HMP)軟件。CSF為開(kāi)發(fā)商提供了一個(gè)高級的、面向對象的界面,該界面將大部分本地接口進(jìn)行了抽象,可以便于迅速展開(kāi)分布式電信應用的開(kāi)發(fā)工作。
可擴展標記語(yǔ)言(XML)是一種廣泛被接受的編碼標準,主要用于編寫(xiě)文本文件結構化信息的代碼。我們建議您使用支持CSF的Xerces開(kāi)放源代碼XML域對象模式(DOM)解析器,它可以幫助您極其輕松地完成許多任務(wù)。如操作本地配置文件,或者解譯來(lái)自web服務(wù)器、影響到通信應用操作的XML數據。
本應用注釋將就CSF和解析器之間的接口進(jìn)行詳細說(shuō)明,以提供運行Xerces XML演示程序的方法。
目錄
介紹
Xerces開(kāi)放源代碼XML解析器是Apache XML項目( http://xml.apache.org/)XML項目組的一個(gè)組成部分。過(guò)去幾年,它們在面向web和其它類(lèi)型的應用中已得到廣泛的應用。電話(huà)應用也不例外。VoiceXML解譯器OpenVXI就使用Xerces作為其核心技術(shù)。呼叫控制協(xié)議,如會(huì )話(huà)發(fā)起協(xié)議(SIP)也使用XML來(lái)控制和傳輸數據。
Dialogic的通信服務(wù)框架(CSF)也從使用XML工具中獲益巨大。本應用注釋具體講述的就是如何將Xerces
DOM解析器集成至CSF中,以及如何在簡(jiǎn)單的測試程序中使用Xerces DOM解析器。本文闡述的原則即是要幫助讀者全面地使用Xerces
DOM,以便于他們更好地構建其各自的CSF應用。
最初的XML集成一般選用的是XML DOM模式,而不是XML的簡(jiǎn)單API(SAX)模式。雖然不如SAX那樣高效,但是這種結構化更明顯的DOM模式卻可以提供更可行的兩步流程。XML文件首先被解析成一個(gè)樹(shù)型結構。任何的語(yǔ)法錯誤均會(huì )在此時(shí)被標記出來(lái)。樹(shù)型結構建成之后,數據收集程序就開(kāi)始遍歷該樹(shù)型結構,將需要的數據取出來(lái),放在應用指定的數據結構中。
環(huán)境
操作系統為Windows*時(shí),本文所述方法之測試環(huán)境所使用的軟件有:
帶有Service Pack 4的Microsoft Windows*
2000 Professional
帶有Service Pack 5的Microsoft Visual
C++ 6.0
Xerces C++,2.6.0版
面向Windows的Dialogic® Dialogic®
System Release 6.0 PCI或面向Windows的DialogicNetStructure
主機媒體處理(HMP)軟件Release 1.2 Feature Pack 1。使用SR
6.0 PCI時(shí)不需要使用電話(huà)硬件,因為此處描述的Xerces演示應用不涉及到電話(huà)技術(shù)。
操作系統為L(cháng)inux*時(shí):
- Red Hat* Enterprise Linux 3.0 update 1
- Xerces C++,2.6.0版
- 面向Linux的DialogicNetStructure 主機媒體處理(HMP)軟件Release
1.2。
Xerces DOM解析器類(lèi)
類(lèi)層次結構
Xerces DOM解析器對象的類(lèi)層次結構非常類(lèi)似于其它CSF電話(huà)網(wǎng)絡(luò )、數據通信或語(yǔ)音設備。抽象的DOM解析器設備包括實(shí)施任何類(lèi)似解析器的有用狀態(tài)信息和基本數據及方法。具體的XercesDOMParser類(lèi)出自于抽象類(lèi),并提供了針對特定Xerces解析器的具體方法和數據。其它類(lèi)似的DOM解析器如果添加到CSF,也可以基于同樣的抽象類(lèi)進(jìn)行構建。圖1詳細描述了該類(lèi)層次結構。

解析器狀態(tài)
Xerces DOM解析器是CSF中的一個(gè)有狀態(tài)的實(shí)體,非常類(lèi)似于通信或語(yǔ)音設備。相對而言,它更為簡(jiǎn)單,因為它不是異步的。所以它的狀態(tài)種類(lèi)更少。例如,它不需"正在進(jìn)行"狀態(tài)。此外,由于本身是同步的,所以它也不需使用CSF命令對象。命令對象與異步命令搭配使用時(shí)可發(fā)揮出色的運行效果,但是除非應用邏輯完全受同一隊列的事件/命令的驅使,否則很容易出現順序問(wèn)題。這樣就有可能需要為同步命令如Xerces解析創(chuàng )建一個(gè)完成事件(completion
event)。而且如果要為CSF添加其它采用異步模式的XML解析器,那么可能也會(huì )出現上述結果。所以這個(gè)時(shí)候,我們采取了相對簡(jiǎn)單的同步方法。
圖2表示的是解析器的狀態(tài)機制。其運轉過(guò)程具體如下。
- 首先創(chuàng )建解析器對象,此時(shí)對象為未初始化狀態(tài)。經(jīng)過(guò)Xerces XML4C子系統的初始化,對象進(jìn)入可用狀態(tài)。
- 然后初始化DOM解析器,指定錯誤處理程序,配置驗證模式,此時(shí)進(jìn)入打開(kāi)狀態(tài)。
- 此時(shí)對象就可以解析XML文件了。完成一個(gè)同步解析操作,就可以創(chuàng )建出一個(gè)表示XML文件的分層DOM樹(shù)結構。在解析過(guò)程中,將自動(dòng)執行XML語(yǔ)法檢查。如果文件存在語(yǔ)法問(wèn)題,解析操作就將會(huì )被中止,以排除該語(yǔ)法錯誤。Xerces還會(huì )將詳細的錯誤信息記錄在CSF事件日志上。
圖2. Xerces DOM解析器的狀態(tài)機制

進(jìn)入已解析狀態(tài)后,就可以通過(guò)應用指定的方法遍歷DOM樹(shù)結構,然后收集相關(guān)數據并轉移至某個(gè)存儲地點(diǎn),以便應用以后使用。
完成DOM樹(shù)結構掃描后,即可發(fā)布掃描結果,解析器對象返回打開(kāi)狀態(tài),以便進(jìn)行另外的XML解析。
解析器池化
Xerces DOM解析器是CSF池化對象。CPoolObj類(lèi)是一個(gè)C++模板,可以將對象存放在可擴展對象池中,這些對象都已經(jīng)過(guò)初始化、可以隨時(shí)使用。當使用GetAvailable()方法向池請求一個(gè)對象時(shí),會(huì )首先搜索一個(gè)對象的向量以查找是否有未使用的條目。如果找到,對象就會(huì )被返回。否則就將創(chuàng )建新的對象。當不再需要對象時(shí),就可以通過(guò)Release()方法將其返回池中,以供日后使用。這樣可以節省運行時(shí)期間刪除和初始化對象的成本。
池化運算還須考慮到對象的狀態(tài)變化。每個(gè)新對象被創(chuàng )建后,它必定會(huì )進(jìn)入打開(kāi)狀態(tài)。對象釋放后,又必定會(huì )回到打開(kāi)狀態(tài)。最后,當應用被關(guān)閉后,池還需要清空,池中的對象也必須全部刪除。
數據采集類(lèi)
XML文件完成解析后,會(huì )有兩個(gè)數據收集類(lèi)來(lái)遍歷DOM樹(shù)結構,以提取所需要的數據。
第一組類(lèi)僅僅概況性地表述STL容器――列表――即用來(lái)存儲已解析數據的容器。具體的容器類(lèi)源自于抽象的基礎類(lèi)。
AparsedValueContainer類(lèi)沒(méi)有數據和方法。它僅用于配合收集程序類(lèi)的運行。(見(jiàn)圖3。)抽象收集程序類(lèi)純虛擬功能CollectValues()的第二個(gè)影響因素是容器,當在具體收集程序類(lèi)實(shí)施中定義了容器時(shí),必須使用通用的基礎類(lèi)。所以在真正使用容器之前,必須在每個(gè)具體的收集程序類(lèi)中進(jìn)行向下類(lèi)型轉換。

該演示使用了兩個(gè)不同的對象列表。其中一張列表的內容是一些描述SIP
URL(SIP地址)的字符串。另一張列表的內容則是一些描述一組組相關(guān)CSF配置信息的對象。
對STL容器列表的訪(fǎng)問(wèn)還將受到Boost范圍鎖的保護。測試程序只是順序訪(fǎng)問(wèn)每個(gè)列表――在收集程序類(lèi)中添加數據,然后等列表構建完成后,在列表上循環(huán)記錄變量值。但是其它未來(lái)的使用方法或許能夠并發(fā)訪(fǎng)問(wèn)列表。因此鎖的使用十分必要。
第二個(gè)必要的類(lèi)是收集程序類(lèi)。它源自于抽象類(lèi),不過(guò)這些抽象類(lèi)僅用于命名純虛擬方法CollectValues,每個(gè)具體的類(lèi)中均必須有這一命名。圖4表示的是測試應用中所使用的收集程序類(lèi)。

具體類(lèi)中的CollectValues方法負責定義每個(gè)具體XML文件圖解的DOM樹(shù)遍歷。它們都知道每個(gè)XML文件中找到的DOM組件與屬性的名稱(chēng),以及存放變量值所需要的STL容器類(lèi)。通過(guò)遞歸呼叫(recursive
call)的使用,它們可以遍歷DOM樹(shù)結構并傳輸Xerces方法返回的屬性,然后存儲至容器。
例如,我們可以看這樣一段XML文件:
它由三個(gè)要素組成――CSFConfig、CONFDEVICES和ConfDevEntry。前兩個(gè)要素只用于為解析和數據收集過(guò)程中的每個(gè)ConfDevEntry提供環(huán)境。CONFDEVICES要素用于確定值所駐留的STL容器,容器(CONFDEVICELIST)的每個(gè)節點(diǎn)都包含一個(gè)對象,對象的成員變量名稱(chēng)類(lèi)似于XML文件中的屬性名稱(chēng)――如ConfType、ConfDevice、Info1等等。成員變量的值將為屬性的值――DCB、dcbB1D1、及空值。
現在我們已經(jīng)了解了從XML到應用指定數據容器的整個(gè)過(guò)程,但讀者在將Xerces DOM解析器類(lèi)用于自己的XML文件上時(shí),還須注意一點(diǎn)。
對于任何新的XML文件定義,只需要編寫(xiě)一個(gè)描述容器類(lèi)的對象即可,然后再編寫(xiě)一個(gè)具體的類(lèi),以接收從已解析DOM樹(shù)結構傳輸的數據。
在定義一個(gè)新XML圖解時(shí),我們建議首先使用Mozilla*或Microsoft Internet
Explorer*等網(wǎng)絡(luò )瀏覽器檢查一下文件的語(yǔ)法。瀏覽器能夠以更清晰的視圖顯示文件的語(yǔ)法,而且更重要的是,瀏覽器還可以提供語(yǔ)法錯誤訊息,并在XML文件中相應的地方指示出來(lái)。
解析器測試應用
基本Xerces解析器和數據收集程序類(lèi)還帶有一個(gè)測試應用樣本。它能夠執行兩類(lèi)XML文件測試。第一個(gè)是對兩個(gè)不同XML文件進(jìn)行單線(xiàn)程、重復解析。它將驗證和解析XML文件的語(yǔ)法,并將結果傳輸至應用定義的STL容器。然后再使用CSF的日志系統顯示容器的組成內容。
第二個(gè)測試是多線(xiàn)程的解析器負載測試。應用將啟動(dòng)四個(gè)線(xiàn)程。然后這些線(xiàn)程再初始化多個(gè)解析器,以便同時(shí)通過(guò)相同的解析順序進(jìn)行解析。這樣可以驗證多個(gè)解析器是否可以同時(shí)在同一個(gè)系統上使用,以及負載測試的實(shí)用性。當延期運行時(shí),負載測試也可以用于檢查是否存在內存或其它系統資源泄漏。
如果測試應用在多線(xiàn)程模式中運行,則有必要將CSF日志級別下降到ERROR。在完全DEBUG級別上運行會(huì )產(chǎn)生大量日志輸出,事件日志線(xiàn)程和應用控制臺窗口也不能與解析器保持同步。提高內存容量可以緩沖需要記錄的數據。在運行應用前,應該在CSF
Xerces目錄中的log4cplus.properties文件中進(jìn)行上述調整。
代碼樣本的系統安裝、構建和執行
Xerces安裝
Xerces XML解析器可以同時(shí)在Windows和Linux操作系統中和CSF配合使用。
Windows操作系統
在Windows下,以二進(jìn)制格式安裝Xerces C++發(fā)行版的操作極其簡(jiǎn)易。該版本名為"Windows
NT 4.0 SP5 compiled with MSVC 6.0 SP3.zip archive",您可以從本注釋曾使用的文件中獲得:http://www.apache.org/dist/xml/xerces-c/binaries/
WinNT_msvc60/xerces-c_2_6_0-windows_nt-msvc_60.zip。您也可以同時(shí)獲得Xerces-C的源代碼。
解壓縮該二進(jìn)制發(fā)行版本至某個(gè)目錄即可。
Linux操作系統
從源代碼安裝Xerces必須在Linux操作系統下才可完成。您可以訪(fǎng)問(wèn)Xerces網(wǎng)站(http://xml.apache.org/xerces-c/),進(jìn)入"當前發(fā)布的Xerces-C源代碼",下載文件xerces-c-current.tar.gz。2004年12月份之后的版本是2.6.0。此版本已經(jīng)過(guò)面向Linux的DialogicNetStructure
主機媒體處理軟件1.2版的測試,測試操作系統為Red
Hat Enterprise Linux 3.0,Update 1。該網(wǎng)站還提供Xerces
Linux二進(jìn)制發(fā)行版,但是最好不要使用,因為它是根據Red Hat Linux 8.0開(kāi)發(fā)的。
解壓縮該發(fā)行版至某個(gè)目錄:
tar xvfz xerces-c-current.tar.gz
設置下列環(huán)境變量:
XERCESCROOT=
export XERCESCROOT
在XERCESCROOT下的構建目錄src/xercesc處輸入:
runConfigure -p linux
gmake
這樣將在$XERCESCROOT/lib目錄下生成2個(gè)動(dòng)態(tài)庫文件,libxerces-c.so.26.0和libxerces-depdom.so.26.0。
構建Xerces DOM解析器應用
此處不介紹完整的CSF系統設置。如欲了解詳細信息,請參見(jiàn)"如欲了解更多信息"部分中的CSF參考(第6頁(yè))。使用Xerces時(shí)無(wú)需考慮特別的事項,僅完成安裝Xerces軟件安裝即可。如果要同時(shí)使用CSF,您必須從Source
Forge上CSF項目處下載CSF 0.7.0或更高版本。該項目的網(wǎng)址為:http://sourceforge.net/projects/
commsvcfw/。
無(wú)論是哪種操作系統,在構建應用之前,您需要在Xerces目錄下的CDomParserObjApp.h頭文件頂部的幾個(gè)#define進(jìn)行設置。
- #define FULL_解析器_LOAD_TEST――(Boolean)如果已經(jīng)定義,則在運行應用時(shí)需要進(jìn)行多線(xiàn)程負載測試。如果沒(méi)有定義,將進(jìn)行單線(xiàn)程測試。切記需要根據所運行的測試調整CSF日志級別。("解析器測試應用"部分中有詳細介紹,第4頁(yè)。)
- #define SIP_URI_TEST_FILE――(URL或文件規范)第一次測試的XML文件的位置。測試文件(SipUri1-3.xml)位于Xerces應用目錄。如果XML文件由web服務(wù)器提供,則應該給出文件的完整URL。
- #define CSF_CONFIG_TEST_FILE――(URL或文件規范)第二次測試的XML文件的位置。測試文件(CSFConfig.xml)位于Xerces應用目錄。如果XML文件由web服務(wù)器提供,則應該給出文件的完整URL。
Windows操作系統
如欲同時(shí)使用CSF,您必須設置3個(gè)環(huán)境變量:XERCES_ROOT、XERCES_INCLUDE和XERCES_LIB。通常的值為
XERCES_ROOT=C:\xerces-c_2_6_0-windows_
nt-msvc_60
XERCES_INCLUDE=%XERCES_ROOT\include
XERCES_LIB=%XERCES_ROOT%\lib
Pathenvironment變量必須包含%XERCES_ROOT%\bin。
完成以上參數設置之后,Visual C++ CSF/Xerces解析器測試應用項目就將能夠定位Xerces組件。
Visual C++ 6.0用于構建CSF和解析器測試應用。該項目可被包含于整體CSF工作空間,該項目本身(Dom解析器Obj.dsp)也可以與Visual
C++同時(shí)運行。
Linux操作系統
如欲同時(shí)使用CSF,您需要設置幾個(gè)環(huán)境變量。首先,將XERCES_ROOT設置為完全路徑,直通頂層X(jué)erces目錄。(這與用于構建Xerces庫本身的XERCESCROOT的值相同。)例如:
XERCES_ROOT=/usr/local/xerces-c-src_2_6_0
export XERCES_ROOT
由于Xerces是一個(gè)動(dòng)態(tài)(共享對象)庫,因此環(huán)境變量LD_LIBRARY_PATH必須包括$XERCES_ROOT/lib。通常設置如下:
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:
${XERCES_ROOT}/lib
export LD_LIBRARY_PATH
運行Xerces應用中的makefile就可構建解析器測試應用。
運行應用
DomParserObj應用完成構建之后,它就可以在任何操作系統的命令行處開(kāi)始運行。
您可以在終端窗口中看到調試或錯誤日志信息,這些信息的位置為CSF Xerces目錄下的test.log文件。您可以看到XML文件每個(gè)重要要素的屬性名稱(chēng)和值。
同時(shí)按Ctrl鍵和C鍵可以按順序關(guān)閉DomParserObj。
其它開(kāi)發(fā)商服務(wù)
Applied Telecom Solutions Center創(chuàng )建的所有解決方案均為完整的應用,但是如上所述,在Dialogic產(chǎn)品未深入的其它領(lǐng)域,它們也未曾有深入的發(fā)展。盡管如此,Dialogic也可以在這些領(lǐng)域助您一臂之力。請聯(lián)系您的銷(xiāo)售團隊或渠道成員,或者致電1-973-993-3030獲取其它專(zhuān)業(yè)資源。Applied
Telecom Solutions Center創(chuàng )建的解決方案可作為完整應用的典范。您可以提供關(guān)于電話(huà)組件的詳細信息,以及關(guān)于其它關(guān)鍵解決方案應用組件的概要信息。通過(guò)http://www.Dialogic.com/上的開(kāi)發(fā)商資源,以及http://www.Dialogic.com/上的Dialogic通信聯(lián)盟成員優(yōu)勢,Dialogic同樣可以在這些領(lǐng)域助您一臂之力。
術(shù)語(yǔ)縮寫(xiě)
CSF 通信服務(wù)框架
DOM 域對象模式
HMP 主機媒體處理
SAX XML的簡(jiǎn)單API
SIP 會(huì )話(huà)初始化協(xié)議
STL 標準模板庫
URI 統一資源標識符
VXML 語(yǔ)音可擴展標記語(yǔ)言
XML 可擴展標記語(yǔ)言
了解更多信息
通信服務(wù)框架源代碼
http://sourceforge.net/projects/commsvcfw
應用注釋?zhuān)和ㄐ欧⻊?wù)框架(CSF)介紹
http://www.Dialogic.com/network/csp/applnots/8989an.htm
應用注釋?zhuān)和ㄐ欧⻊?wù)框架的基本原理(第2版)
http://www.Dialogic.com/network/csp/applnots/9333.htm
Xerces C++解析器網(wǎng)站
http://xml.apache.org/xerces-c/
如欲了解更多信息,請訪(fǎng)問(wèn)Dialogic網(wǎng)站http://www.Dialogic.com。
|