要點綜述
本應(yīng)用注釋即將討論的是Dialogic之通信服務(wù)框架(CSF)的一個新組件。CSF是一個開放源代碼軟件套件,可以幫助開發(fā)商更輕松地開發(fā)支持Dialogic®
NetStructure®板卡的高級應(yīng)用和Dialogic®
NetStructure®主機(jī)媒體處理(HMP)軟件。CSF為開發(fā)商提供了一個高級的、面向?qū)ο蟮慕缑妫摻缑鎸⒋蟛糠直镜亟涌谶M(jìn)行了抽象,可以便于迅速展開分布式電信應(yīng)用的開發(fā)工作。
可擴(kuò)展標(biāo)記語言(XML)是一種廣泛被接受的編碼標(biāo)準(zhǔn),主要用于編寫文本文件結(jié)構(gòu)化信息的代碼。我們建議您使用支持CSF的Xerces開放源代碼XML域?qū)ο竽J剑―OM)解析器,它可以幫助您極其輕松地完成許多任務(wù)。如操作本地配置文件,或者解譯來自web服務(wù)器、影響到通信應(yīng)用操作的XML數(shù)據(jù)。
本應(yīng)用注釋將就CSF和解析器之間的接口進(jìn)行詳細(xì)說明,以提供運行Xerces XML演示程序的方法。
目錄
介紹
Xerces開放源代碼XML解析器是Apache XML項目( http://xml.apache.org/)XML項目組的一個組成部分。過去幾年,它們在面向web和其它類型的應(yīng)用中已得到廣泛的應(yīng)用。電話應(yīng)用也不例外。VoiceXML解譯器OpenVXI就使用Xerces作為其核心技術(shù)。呼叫控制協(xié)議,如會話發(fā)起協(xié)議(SIP)也使用XML來控制和傳輸數(shù)據(jù)。
Dialogic的通信服務(wù)框架(CSF)也從使用XML工具中獲益巨大。本應(yīng)用注釋具體講述的就是如何將Xerces
DOM解析器集成至CSF中,以及如何在簡單的測試程序中使用Xerces DOM解析器。本文闡述的原則即是要幫助讀者全面地使用Xerces
DOM,以便于他們更好地構(gòu)建其各自的CSF應(yīng)用。
最初的XML集成一般選用的是XML DOM模式,而不是XML的簡單API(SAX)模式。雖然不如SAX那樣高效,但是這種結(jié)構(gòu)化更明顯的DOM模式卻可以提供更可行的兩步流程。XML文件首先被解析成一個樹型結(jié)構(gòu)。任何的語法錯誤均會在此時被標(biāo)記出來。樹型結(jié)構(gòu)建成之后,數(shù)據(jù)收集程序就開始遍歷該樹型結(jié)構(gòu),將需要的數(shù)據(jù)取出來,放在應(yīng)用指定的數(shù)據(jù)結(jié)構(gòu)中。
環(huán)境
操作系統(tǒng)為Windows*時,本文所述方法之測試環(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
主機(jī)媒體處理(HMP)軟件Release 1.2 Feature Pack 1。使用SR
6.0 PCI時不需要使用電話硬件,因為此處描述的Xerces演示應(yīng)用不涉及到電話技術(shù)。
操作系統(tǒng)為Linux*時:
- Red Hat* Enterprise Linux 3.0 update 1
- Xerces C++,2.6.0版
- 面向Linux的DialogicNetStructure 主機(jī)媒體處理(HMP)軟件Release
1.2。
Xerces DOM解析器類
類層次結(jié)構(gòu)
Xerces DOM解析器對象的類層次結(jié)構(gòu)非常類似于其它CSF電話網(wǎng)絡(luò)、數(shù)據(jù)通信或語音設(shè)備。抽象的DOM解析器設(shè)備包括實施任何類似解析器的有用狀態(tài)信息和基本數(shù)據(jù)及方法。具體的XercesDOMParser類出自于抽象類,并提供了針對特定Xerces解析器的具體方法和數(shù)據(jù)。其它類似的DOM解析器如果添加到CSF,也可以基于同樣的抽象類進(jìn)行構(gòu)建。圖1詳細(xì)描述了該類層次結(jié)構(gòu)。
解析器狀態(tài)
Xerces DOM解析器是CSF中的一個有狀態(tài)的實體,非常類似于通信或語音設(shè)備。相對而言,它更為簡單,因為它不是異步的。所以它的狀態(tài)種類更少。例如,它不需"正在進(jìn)行"狀態(tài)。此外,由于本身是同步的,所以它也不需使用CSF命令對象。命令對象與異步命令搭配使用時可發(fā)揮出色的運行效果,但是除非應(yīng)用邏輯完全受同一隊列的事件/命令的驅(qū)使,否則很容易出現(xiàn)順序問題。這樣就有可能需要為同步命令如Xerces解析創(chuàng)建一個完成事件(completion
event)。而且如果要為CSF添加其它采用異步模式的XML解析器,那么可能也會出現(xiàn)上述結(jié)果。所以這個時候,我們采取了相對簡單的同步方法。
圖2表示的是解析器的狀態(tài)機(jī)制。其運轉(zhuǎn)過程具體如下。
- 首先創(chuàng)建解析器對象,此時對象為未初始化狀態(tài)。經(jīng)過Xerces XML4C子系統(tǒng)的初始化,對象進(jìn)入可用狀態(tài)。
- 然后初始化DOM解析器,指定錯誤處理程序,配置驗證模式,此時進(jìn)入打開狀態(tài)。
- 此時對象就可以解析XML文件了。完成一個同步解析操作,就可以創(chuàng)建出一個表示XML文件的分層DOM樹結(jié)構(gòu)。在解析過程中,將自動執(zhí)行XML語法檢查。如果文件存在語法問題,解析操作就將會被中止,以排除該語法錯誤。Xerces還會將詳細(xì)的錯誤信息記錄在CSF事件日志上。
圖2. Xerces DOM解析器的狀態(tài)機(jī)制
進(jìn)入已解析狀態(tài)后,就可以通過應(yīng)用指定的方法遍歷DOM樹結(jié)構(gòu),然后收集相關(guān)數(shù)據(jù)并轉(zhuǎn)移至某個存儲地點,以便應(yīng)用以后使用。
完成DOM樹結(jié)構(gòu)掃描后,即可發(fā)布掃描結(jié)果,解析器對象返回打開狀態(tài),以便進(jìn)行另外的XML解析。
解析器池化
Xerces DOM解析器是CSF池化對象。CPoolObj類是一個C++模板,可以將對象存放在可擴(kuò)展對象池中,這些對象都已經(jīng)過初始化、可以隨時使用。當(dāng)使用GetAvailable()方法向池請求一個對象時,會首先搜索一個對象的向量以查找是否有未使用的條目。如果找到,對象就會被返回。否則就將創(chuàng)建新的對象。當(dāng)不再需要對象時,就可以通過Release()方法將其返回池中,以供日后使用。這樣可以節(jié)省運行時期間刪除和初始化對象的成本。
池化運算還須考慮到對象的狀態(tài)變化。每個新對象被創(chuàng)建后,它必定會進(jìn)入打開狀態(tài)。對象釋放后,又必定會回到打開狀態(tài)。最后,當(dāng)應(yīng)用被關(guān)閉后,池還需要清空,池中的對象也必須全部刪除。
數(shù)據(jù)采集類
XML文件完成解析后,會有兩個數(shù)據(jù)收集類來遍歷DOM樹結(jié)構(gòu),以提取所需要的數(shù)據(jù)。
第一組類僅僅概況性地表述STL容器――列表――即用來存儲已解析數(shù)據(jù)的容器。具體的容器類源自于抽象的基礎(chǔ)類。
AparsedValueContainer類沒有數(shù)據(jù)和方法。它僅用于配合收集程序類的運行。(見圖3。)抽象收集程序類純虛擬功能CollectValues()的第二個影響因素是容器,當(dāng)在具體收集程序類實施中定義了容器時,必須使用通用的基礎(chǔ)類。所以在真正使用容器之前,必須在每個具體的收集程序類中進(jìn)行向下類型轉(zhuǎn)換。
該演示使用了兩個不同的對象列表。其中一張列表的內(nèi)容是一些描述SIP
URL(SIP地址)的字符串。另一張列表的內(nèi)容則是一些描述一組組相關(guān)CSF配置信息的對象。
對STL容器列表的訪問還將受到Boost范圍鎖的保護(hù)。測試程序只是順序訪問每個列表――在收集程序類中添加數(shù)據(jù),然后等列表構(gòu)建完成后,在列表上循環(huán)記錄變量值。但是其它未來的使用方法或許能夠并發(fā)訪問列表。因此鎖的使用十分必要。
第二個必要的類是收集程序類。它源自于抽象類,不過這些抽象類僅用于命名純虛擬方法CollectValues,每個具體的類中均必須有這一命名。圖4表示的是測試應(yīng)用中所使用的收集程序類。
具體類中的CollectValues方法負(fù)責(zé)定義每個具體XML文件圖解的DOM樹遍歷。它們都知道每個XML文件中找到的DOM組件與屬性的名稱,以及存放變量值所需要的STL容器類。通過遞歸呼叫(recursive
call)的使用,它們可以遍歷DOM樹結(jié)構(gòu)并傳輸Xerces方法返回的屬性,然后存儲至容器。
例如,我們可以看這樣一段XML文件:
它由三個要素組成――CSFConfig、CONFDEVICES和ConfDevEntry。前兩個要素只用于為解析和數(shù)據(jù)收集過程中的每個ConfDevEntry提供環(huán)境。CONFDEVICES要素用于確定值所駐留的STL容器,容器(CONFDEVICELIST)的每個節(jié)點都包含一個對象,對象的成員變量名稱類似于XML文件中的屬性名稱――如ConfType、ConfDevice、Info1等等。成員變量的值將為屬性的值――DCB、dcbB1D1、及空值。
現(xiàn)在我們已經(jīng)了解了從XML到應(yīng)用指定數(shù)據(jù)容器的整個過程,但讀者在將Xerces DOM解析器類用于自己的XML文件上時,還須注意一點。
對于任何新的XML文件定義,只需要編寫一個描述容器類的對象即可,然后再編寫一個具體的類,以接收從已解析DOM樹結(jié)構(gòu)傳輸?shù)臄?shù)據(jù)。
在定義一個新XML圖解時,我們建議首先使用Mozilla*或Microsoft Internet
Explorer*等網(wǎng)絡(luò)瀏覽器檢查一下文件的語法。瀏覽器能夠以更清晰的視圖顯示文件的語法,而且更重要的是,瀏覽器還可以提供語法錯誤訊息,并在XML文件中相應(yīng)的地方指示出來。
解析器測試應(yīng)用
基本Xerces解析器和數(shù)據(jù)收集程序類還帶有一個測試應(yīng)用樣本。它能夠執(zhí)行兩類XML文件測試。第一個是對兩個不同XML文件進(jìn)行單線程、重復(fù)解析。它將驗證和解析XML文件的語法,并將結(jié)果傳輸至應(yīng)用定義的STL容器。然后再使用CSF的日志系統(tǒng)顯示容器的組成內(nèi)容。
第二個測試是多線程的解析器負(fù)載測試。應(yīng)用將啟動四個線程。然后這些線程再初始化多個解析器,以便同時通過相同的解析順序進(jìn)行解析。這樣可以驗證多個解析器是否可以同時在同一個系統(tǒng)上使用,以及負(fù)載測試的實用性。當(dāng)延期運行時,負(fù)載測試也可以用于檢查是否存在內(nèi)存或其它系統(tǒng)資源泄漏。
如果測試應(yīng)用在多線程模式中運行,則有必要將CSF日志級別下降到ERROR。在完全DEBUG級別上運行會產(chǎn)生大量日志輸出,事件日志線程和應(yīng)用控制臺窗口也不能與解析器保持同步。提高內(nèi)存容量可以緩沖需要記錄的數(shù)據(jù)。在運行應(yīng)用前,應(yīng)該在CSF
Xerces目錄中的log4cplus.properties文件中進(jìn)行上述調(diào)整。
代碼樣本的系統(tǒng)安裝、構(gòu)建和執(zhí)行
Xerces安裝
Xerces XML解析器可以同時在Windows和Linux操作系統(tǒng)中和CSF配合使用。
Windows操作系統(tǒng)
在Windows下,以二進(jìn)制格式安裝Xerces C++發(fā)行版的操作極其簡易。該版本名為"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。您也可以同時獲得Xerces-C的源代碼。
解壓縮該二進(jìn)制發(fā)行版本至某個目錄即可。
Linux操作系統(tǒng)
從源代碼安裝Xerces必須在Linux操作系統(tǒng)下才可完成。您可以訪問Xerces網(wǎng)站(http://xml.apache.org/xerces-c/),進(jìn)入"當(dāng)前發(fā)布的Xerces-C源代碼",下載文件xerces-c-current.tar.gz。2004年12月份之后的版本是2.6.0。此版本已經(jīng)過面向Linux的DialogicNetStructure
主機(jī)媒體處理軟件1.2版的測試,測試操作系統(tǒng)為Red
Hat Enterprise Linux 3.0,Update 1。該網(wǎng)站還提供Xerces
Linux二進(jìn)制發(fā)行版,但是最好不要使用,因為它是根據(jù)Red Hat Linux 8.0開發(fā)的。
解壓縮該發(fā)行版至某個目錄:
tar xvfz xerces-c-current.tar.gz
設(shè)置下列環(huán)境變量:
XERCESCROOT=
export XERCESCROOT
在XERCESCROOT下的構(gòu)建目錄src/xercesc處輸入:
runConfigure -p linux
gmake
這樣將在$XERCESCROOT/lib目錄下生成2個動態(tài)庫文件,libxerces-c.so.26.0和libxerces-depdom.so.26.0。
構(gòu)建Xerces DOM解析器應(yīng)用
此處不介紹完整的CSF系統(tǒng)設(shè)置。如欲了解詳細(xì)信息,請參見"如欲了解更多信息"部分中的CSF參考(第6頁)。使用Xerces時無需考慮特別的事項,僅完成安裝Xerces軟件安裝即可。如果要同時使用CSF,您必須從Source
Forge上CSF項目處下載CSF 0.7.0或更高版本。該項目的網(wǎng)址為:http://sourceforge.net/projects/
commsvcfw/。
無論是哪種操作系統(tǒng),在構(gòu)建應(yīng)用之前,您需要在Xerces目錄下的CDomParserObjApp.h頭文件頂部的幾個#define進(jìn)行設(shè)置。
- #define FULL_解析器_LOAD_TEST――(Boolean)如果已經(jīng)定義,則在運行應(yīng)用時需要進(jìn)行多線程負(fù)載測試。如果沒有定義,將進(jìn)行單線程測試。切記需要根據(jù)所運行的測試調(diào)整CSF日志級別。("解析器測試應(yīng)用"部分中有詳細(xì)介紹,第4頁。)
- #define SIP_URI_TEST_FILE――(URL或文件規(guī)范)第一次測試的XML文件的位置。測試文件(SipUri1-3.xml)位于Xerces應(yīng)用目錄。如果XML文件由web服務(wù)器提供,則應(yīng)該給出文件的完整URL。
- #define CSF_CONFIG_TEST_FILE――(URL或文件規(guī)范)第二次測試的XML文件的位置。測試文件(CSFConfig.xml)位于Xerces應(yīng)用目錄。如果XML文件由web服務(wù)器提供,則應(yīng)該給出文件的完整URL。
Windows操作系統(tǒng)
如欲同時使用CSF,您必須設(shè)置3個環(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。
完成以上參數(shù)設(shè)置之后,Visual C++ CSF/Xerces解析器測試應(yīng)用項目就將能夠定位Xerces組件。
Visual C++ 6.0用于構(gòu)建CSF和解析器測試應(yīng)用。該項目可被包含于整體CSF工作空間,該項目本身(Dom解析器Obj.dsp)也可以與Visual
C++同時運行。
Linux操作系統(tǒng)
如欲同時使用CSF,您需要設(shè)置幾個環(huán)境變量。首先,將XERCES_ROOT設(shè)置為完全路徑,直通頂層Xerces目錄。(這與用于構(gòu)建Xerces庫本身的XERCESCROOT的值相同。)例如:
XERCES_ROOT=/usr/local/xerces-c-src_2_6_0
export XERCES_ROOT
由于Xerces是一個動態(tài)(共享對象)庫,因此環(huán)境變量LD_LIBRARY_PATH必須包括$XERCES_ROOT/lib。通常設(shè)置如下:
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:
${XERCES_ROOT}/lib
export LD_LIBRARY_PATH
運行Xerces應(yīng)用中的makefile就可構(gòu)建解析器測試應(yīng)用。
運行應(yīng)用
DomParserObj應(yīng)用完成構(gòu)建之后,它就可以在任何操作系統(tǒng)的命令行處開始運行。
您可以在終端窗口中看到調(diào)試或錯誤日志信息,這些信息的位置為CSF Xerces目錄下的test.log文件。您可以看到XML文件每個重要要素的屬性名稱和值。
同時按Ctrl鍵和C鍵可以按順序關(guān)閉DomParserObj。
其它開發(fā)商服務(wù)
Applied Telecom Solutions Center創(chuàng)建的所有解決方案均為完整的應(yīng)用,但是如上所述,在Dialogic產(chǎn)品未深入的其它領(lǐng)域,它們也未曾有深入的發(fā)展。盡管如此,Dialogic也可以在這些領(lǐng)域助您一臂之力。請聯(lián)系您的銷售團(tuán)隊或渠道成員,或者致電1-973-993-3030獲取其它專業(yè)資源。Applied
Telecom Solutions Center創(chuàng)建的解決方案可作為完整應(yīng)用的典范。您可以提供關(guān)于電話組件的詳細(xì)信息,以及關(guān)于其它關(guān)鍵解決方案應(yīng)用組件的概要信息。通過http://www.Dialogic.com/上的開發(fā)商資源,以及http://www.Dialogic.com/上的Dialogic通信聯(lián)盟成員優(yōu)勢,Dialogic同樣可以在這些領(lǐng)域助您一臂之力。
術(shù)語縮寫
CSF 通信服務(wù)框架
DOM 域?qū)ο竽J?br>
HMP 主機(jī)媒體處理
SAX XML的簡單API
SIP 會話初始化協(xié)議
STL 標(biāo)準(zhǔn)模板庫
URI 統(tǒng)一資源標(biāo)識符
VXML 語音可擴(kuò)展標(biāo)記語言
XML 可擴(kuò)展標(biāo)記語言
了解更多信息
通信服務(wù)框架源代碼
http://sourceforge.net/projects/commsvcfw
應(yīng)用注釋:通信服務(wù)框架(CSF)介紹
http://www.Dialogic.com/network/csp/applnots/8989an.htm
應(yīng)用注釋:通信服務(wù)框架的基本原理(第2版)
http://www.Dialogic.com/network/csp/applnots/9333.htm
Xerces C++解析器網(wǎng)站
http://xml.apache.org/xerces-c/
如欲了解更多信息,請訪問Dialogic網(wǎng)站http://www.Dialogic.com。
|