【摘要】XML作為一種國際化的通用標(biāo)記語言,廣泛應(yīng)用于IT產(chǎn)業(yè)的各個(gè)領(lǐng)域。數(shù)據(jù)交換是XML的重要應(yīng)用之一,平臺(tái)間的接口就常采用它來實(shí)現(xiàn)。數(shù)據(jù)接口一般都較為穩(wěn)定,但也不盡然。本文就是為了應(yīng)對(duì)XML接口格式的頻繁變化,探索并提出了一種全新的解決方案,設(shè)計(jì)和研發(fā)了基于數(shù)據(jù)庫的XML腳本及其實(shí)現(xiàn)引擎。該引擎已通過了北京同方衛(wèi)康科技有限公司的測試,應(yīng)用于實(shí)踐。
【關(guān)鍵詞】XMLScript數(shù)據(jù)交換語法分析器語法解析器棧
一、引言
XML是由W3C組織于1998年2月制定的一種通用語言規(guī)范。XML是SGML(標(biāo)準(zhǔn)通用標(biāo)記語言)的一個(gè)子集,其最大優(yōu)點(diǎn)在于適合網(wǎng)上發(fā)布和數(shù)據(jù)交換[1]。XML是目前全球范圍內(nèi)描述數(shù)據(jù)和交換數(shù)據(jù)的一種標(biāo)準(zhǔn)的方式。XML作為平臺(tái)接口,一般數(shù)據(jù)格式都比較穩(wěn)定,可以用多種技術(shù)和方式來實(shí)現(xiàn)它;但當(dāng)數(shù)據(jù)格式變動(dòng)比較頻繁的情況下,每次數(shù)據(jù)格式的微小變化都必須修改源代碼。本文就是以北京同方衛(wèi)康科技有限公司面對(duì)北京市衛(wèi)生局統(tǒng)計(jì)平臺(tái)接口的變化為契機(jī),提出了一種應(yīng)對(duì)這種變化的通用解決方案。
二、Xml腳本引擎的設(shè)計(jì)原理
2.1XML通用設(shè)計(jì)接口
作為一種數(shù)據(jù)交換的中間件,XML具有跨平臺(tái)、結(jié)構(gòu)化和子描述性強(qiáng)的特點(diǎn)[2]。因此,常用XML作為系統(tǒng)和平臺(tái)間的數(shù)據(jù)接口。設(shè)計(jì)師們通過分析數(shù)據(jù)接口的格式,從數(shù)據(jù)庫或者基于數(shù)據(jù)庫的數(shù)據(jù)層中產(chǎn)生這些數(shù)據(jù)。圖1簡單描述了這種通用性XML的生成過程。
2.2XML腳本引擎工作流程
由通用XML生成流程圖易見,如XML數(shù)據(jù)格式變化比較頻繁,哪怕只有一個(gè)微小的改動(dòng),也得修改代碼。本文設(shè)計(jì)的基于數(shù)據(jù)庫的XML腳本引擎,一般情況下,只需通過更新XML模板文件就能夠應(yīng)對(duì)這種變化;而此引擎可以作為Active DLL或者基層類庫來使用。圖2,展示了該引擎的工作流程圖。
三、XML腳本引擎設(shè)計(jì)與實(shí)現(xiàn)
3.1XML腳本
在XML示例文件基礎(chǔ)上添加一些自定義語法規(guī)則信息,我們把這些符合一定規(guī)范的附加信息叫做XML腳本(XMLScript)。
XMLScript規(guī)則制定如下:(1)腳本位置。(a)置于注釋節(jié)點(diǎn)中;(b)置于無實(shí)際功用的描述性屬性中;(c)置于Element的Text文本值中;(2)變量信息定義。(a)單變量格式:{@變量名:變量值}。(b)多變量格式:{@變量名1:變量值1;@變量名2:變量值2};(3)執(zhí)行語句:(a)Sql執(zhí)行語句:{@fSQL:@數(shù)據(jù)庫連接變量,@r記錄集變量,@Sql語句變量[;@變量|@r其他已打開記錄集.字段]*};(b)刪除空節(jié)點(diǎn):{@fDelNullNode:true | 1};(c)循環(huán)節(jié)點(diǎn):{@fLOOP1:記錄集};(d)自定義函數(shù):{@f函數(shù)名:[變量]}。
3.2XMLScript模板
我們稱加入了XMLScript的XML文件為XMLScript模板,即XMLScript Template。模板示例如下:
注:本示例中所采用的SQL語句是同方的工程師們?cè)谘芯縎QL SERVER優(yōu)化機(jī)制后采用的優(yōu)化形式,其功效與參數(shù)化查詢不相上下,但要簡練得多。
3.3XML腳本引擎
我們把通過解析和解釋XMLScript模板,自動(dòng)從數(shù)據(jù)庫中獲取指定數(shù)據(jù)的軟件體系稱為XML腳本引擎(DBToXMLScript Engine)。
鑒于XML的層級(jí)特點(diǎn)和腳本定義的語法規(guī)則,該引擎采用棧作為主存儲(chǔ)結(jié)構(gòu)。引擎加載XMLScript模板后,語法分析器逐次遍歷各節(jié)點(diǎn),從節(jié)點(diǎn)信息中提取出腳本信息,再交由語法解釋器處理。該引擎采用的是邊解釋邊執(zhí)行的方式,故可視為解釋型引擎,具體設(shè)計(jì)架構(gòu)如圖3所示。
(1)語法分析器(Parser)
語法分析器,用于分析XML模板文件,循環(huán)遍歷各節(jié)點(diǎn),提取出XMLScript,再把這些腳本信息交由語法解析器來處理。
(2)語法解釋器(Interpreter)
語法解釋器,把分析器推送過來的語法信息分類,參照該層次XML節(jié)點(diǎn)依次把腳本和節(jié)點(diǎn)信息放入不同的棧中,并依次執(zhí)行“執(zhí)行語句”,生成目標(biāo)XML文件。
執(zhí)行期間,還需記錄操作日志、刪除空節(jié)點(diǎn)、刪除屬性信息等。記錄操作日志,可以協(xié)助調(diào)試和發(fā)現(xiàn)錯(cuò)誤信息;刪除空節(jié)點(diǎn)可以刪除一些無用的記錄;刪除屬性信息,可以減小XML文件的大小。這幾項(xiàng)操作被設(shè)置為了可選項(xiàng),但它們?cè)陂_發(fā)和應(yīng)用中往往是必不可少的。
除已定義好的函數(shù)外,該引擎還允許它的用戶(客戶端)重載自定義函數(shù),來對(duì)從數(shù)據(jù)庫中得到的數(shù)據(jù)進(jìn)行加工,以滿足最終平臺(tái)的要求。如示例模板中的{@fDICT_GENDER:@r病人基本信息.GENDERID},由于客戶醫(yī)院的性別字典ID值與衛(wèi)生局平臺(tái)不一致,因此需要一個(gè)重載的函數(shù)DICT_GENDER來實(shí)現(xiàn)。
(3)棧(Stack)
按XMLScript包含的信息,??杀环譃槿悾撼A織!⒚顥?、記錄集棧。常量變量信息都存儲(chǔ)為常量;命令棧,用于存儲(chǔ)可執(zhí)行語句信息;記錄集棧,用于存儲(chǔ)數(shù)據(jù)庫查詢操作返回的記錄集。
XMLScript的變量采用棧作為存儲(chǔ)結(jié)構(gòu),因此腳本的位置決定了其所在的作用域,就如同程序變量一樣。首先,位于XML根節(jié)點(diǎn)之前的Script,其中的變量信息可被視為全局變量,最先入棧卻最后出棧;再者,位于各節(jié)點(diǎn)間和節(jié)點(diǎn)屬性內(nèi)的Script,其中的變量信息也依次入棧,同時(shí)還必須增加輔助標(biāo)記,以在該節(jié)點(diǎn)訪問完畢后釋放該節(jié)點(diǎn)內(nèi)的變量。
3.4引擎測試與驗(yàn)證
該引擎只對(duì)外公開了幾個(gè)屬性和三個(gè)方法,但卻可以完成復(fù)雜的功能。事實(shí)上,只有加載XML模板文件Load方法和保存SaveAs方法才是必須的,UserFunction方法用來擴(kuò)展自定義函數(shù),實(shí)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)的二次處理,只有必要時(shí)才重載。
該引擎易于使用,核心測試代碼如下:
DBToXML engine =new DBToXML( );
engine.Load(@“C:\template.xml”);
engine.SaveAs(@”C:\result.xml”);
運(yùn)行結(jié)果如圖4所示。
四、結(jié)束語
本文設(shè)計(jì)和開發(fā)了基于數(shù)據(jù)庫的XML腳本及其引擎,將XML接口的易變性封裝在了XML腳本模板中,只需更新模板文件就能應(yīng)對(duì)接口的變化,極大的提高了開發(fā)人員的工作效率。由于該引擎直接操作數(shù)據(jù)庫勢必會(huì)造成性能損失,不適用于對(duì)實(shí)時(shí)性要求較高的系統(tǒng)。另外,SQL語句置于模板文件,模板位置可能直接影響公司數(shù)據(jù)安全,對(duì)安全性要求較高的用戶需增加防護(hù)策略。
參考文獻(xiàn)
[1]王仲,陳曉鷗.基于XML的數(shù)據(jù)交換與存取技術(shù)研究.計(jì)算機(jī)工程與應(yīng)用,2001,24:108-111
[2]孫君明,郭紅.基于XML的異構(gòu)信息交換技術(shù)研究[J].計(jì)算機(jī)應(yīng)用研究,2003,20(1):72-73