本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及一種可擴(kuò)展標(biāo)記語言(Extensible Markup Language,XML)數(shù)據(jù)的解析方法和裝置。
背景技術(shù):
可擴(kuò)展標(biāo)記語言(Extensible Markup Language,XML),標(biāo)準(zhǔn)通用標(biāo)記語言的子集,一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言。它可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言。它非常適合因特網(wǎng)傳輸,提供統(tǒng)一的方法來描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。XML以其自身的特點(diǎn)成為系統(tǒng)之間數(shù)據(jù)信息交換的標(biāo)準(zhǔn)。
在Java(計(jì)算機(jī)編程語言)的語言環(huán)境下,現(xiàn)有的XML數(shù)據(jù)解析技術(shù)主要有JDOM和DOM4J等等。
具體來說,在采用JDOM方法解析XML數(shù)據(jù)時(shí),解析器SAX執(zhí)行的具體解析流程為:將XML數(shù)據(jù)中的全部字符串轉(zhuǎn)換為文檔模型對(duì)象(document),即DOM樹形結(jié)構(gòu);然后對(duì)轉(zhuǎn)換后的文檔模型對(duì)象進(jìn)行順序掃描及遍歷操作,最終得到對(duì)應(yīng)的業(yè)務(wù)對(duì)象,例如元素或元素屬性值。在SAX解析文檔模型對(duì)象過程中,遇到文檔模型對(duì)象的開始與結(jié)束,元素的開始與結(jié)束的地方都會(huì)觸發(fā)一系列的事件處理函數(shù),由這些函數(shù)來完成相應(yīng)的操作。
在采用DOM4J方法解析XML報(bào)文時(shí),具體解析流程與JDOM方法類似,與之不同的是,在DOM4J方法中,大量使用了應(yīng)用程序編程接口(Application Programming Interface,API)中的Collections類,并且還提供了一些替代方法以獲取更好的解析性能或更直接的編碼方式,可在很多開源項(xiàng)目中使用,例如Hibernate。
從上述兩種解析流程中可以看出,不管采用哪種解析流程,均需要首先將XML數(shù)據(jù)中所有字符串轉(zhuǎn)換為文檔模型對(duì)象,并存儲(chǔ)在內(nèi)存中,然后如果想得到需要的業(yè)務(wù)對(duì)象,還需要定制開發(fā)轉(zhuǎn)換程序,將文檔模型對(duì)象逐個(gè)映射到業(yè)務(wù)對(duì)象上。這種方法存在下述缺陷:
首先,轉(zhuǎn)換得到的文檔模型對(duì)象需要占用內(nèi)存,而且XML數(shù)據(jù)越大,占用的內(nèi)存越多,存在內(nèi)存溢出的風(fēng)險(xiǎn);其次,在XML數(shù)據(jù)比較大的情況下,采用上述解析方法會(huì)使解析性能嚴(yán)重降低,耗時(shí)會(huì)呈指數(shù)式上升;最后,定制開發(fā)轉(zhuǎn)換程序需要耗費(fèi)寶貴的人力資源,而且開發(fā)的質(zhì)量也無法完全保證。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種XML數(shù)據(jù)的解析方法和裝置,能夠?qū)ML數(shù)據(jù)直接轉(zhuǎn)換為業(yè)務(wù)對(duì)象,明顯提高解析性能。
本發(fā)明實(shí)施例采用以下技術(shù)方案:
本發(fā)明實(shí)施例提供了一種XML數(shù)據(jù)的解析方法,包括:
確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型;
從預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息;其中,所述節(jié)點(diǎn)配置信息中包含:節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型;
對(duì)所述XML數(shù)據(jù)中的每行數(shù)據(jù)依次執(zhí)行下述操作,直至解析完所述XML數(shù)據(jù):
根據(jù)所述節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,確定當(dāng)前行數(shù)據(jù)對(duì)應(yīng)的節(jié)點(diǎn)和所述節(jié)點(diǎn)的數(shù)據(jù)類型;
根據(jù)所述節(jié)點(diǎn)的數(shù)據(jù)類型,對(duì)所述節(jié)點(diǎn)進(jìn)行解析,得到所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
當(dāng)所述節(jié)點(diǎn)不是所述XML數(shù)據(jù)中的根節(jié)點(diǎn)時(shí),將得到的業(yè)務(wù)對(duì)象賦值給所述節(jié)點(diǎn)的父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
其中,根據(jù)所述節(jié)點(diǎn)的數(shù)據(jù)類型,對(duì)所述節(jié)點(diǎn)進(jìn)行解析,得到所述節(jié)點(diǎn)的 業(yè)務(wù)對(duì)象;
當(dāng)所述節(jié)點(diǎn)的數(shù)據(jù)類型為原始類型時(shí),獲取所述節(jié)點(diǎn)的原始類型值,作為為所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
當(dāng)所述節(jié)點(diǎn)的數(shù)據(jù)類型為對(duì)象類型時(shí),為所述節(jié)點(diǎn)創(chuàng)建新的業(yè)務(wù)對(duì)象,作為所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
其中,確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型,具體包括:
判斷所述XML數(shù)據(jù)中是否攜帶文檔對(duì)象類型;
當(dāng)判斷出所述XML數(shù)據(jù)中攜帶了文檔對(duì)象類型時(shí),將所述XML數(shù)據(jù)攜帶的文檔對(duì)象類型確定為所述XML數(shù)據(jù)的文檔對(duì)象類型;
當(dāng)判斷出所述XML數(shù)據(jù)中未攜帶文檔對(duì)象類型時(shí),將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為所述XML數(shù)據(jù)的文檔對(duì)象類型。
其中,將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為所述XML數(shù)據(jù)的文檔對(duì)象類型,具體包括:
確定所述XML數(shù)據(jù)中的根節(jié)點(diǎn);其中所述根節(jié)點(diǎn)為所述XML數(shù)據(jù)中第一個(gè)包含開始標(biāo)記和結(jié)束標(biāo)記的節(jié)點(diǎn);
將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為所述XML數(shù)據(jù)的文檔對(duì)象類型。
其中,確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型之前,所述方法還包括:
從配置庫中讀取預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息;
將讀取的節(jié)點(diǎn)配置信息按照其對(duì)應(yīng)的文檔對(duì)象類型存儲(chǔ)在緩存中;則
從預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息,具體包括:
從預(yù)先存儲(chǔ)在緩存中的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息。
本發(fā)明實(shí)施例提供了一種XML數(shù)據(jù)的解析裝置,包括:
文檔對(duì)象類型確定單元,用于確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型;
節(jié)點(diǎn)配置信息獲取單元,用于從預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型確定單元確定的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息;其中,所述節(jié)點(diǎn)配置信息中包含:節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型;
解析單元,用于對(duì)所述XML數(shù)據(jù)中的每行數(shù)據(jù)依次執(zhí)行下述操作,直至解析完所述XML數(shù)據(jù):
根據(jù)所述節(jié)點(diǎn)配置信息獲取單元獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,確定當(dāng)前行數(shù)據(jù)對(duì)應(yīng)的節(jié)點(diǎn)和所述節(jié)點(diǎn)的數(shù)據(jù)類型;根據(jù)所述節(jié)點(diǎn)的數(shù)據(jù)類型,對(duì)所述節(jié)點(diǎn)進(jìn)行解析,得到所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;當(dāng)所述節(jié)點(diǎn)不是所述XML數(shù)據(jù)中的根節(jié)點(diǎn)時(shí),將得到的業(yè)務(wù)對(duì)象賦值給所述節(jié)點(diǎn)的父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
其中,所述解析單元,具體用于:
當(dāng)所述節(jié)點(diǎn)的數(shù)據(jù)類型為原始類型時(shí),獲取所述節(jié)點(diǎn)的原始類型值,作為為所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
當(dāng)所述節(jié)點(diǎn)的數(shù)據(jù)類型為對(duì)象類型時(shí),為所述節(jié)點(diǎn)創(chuàng)建新的業(yè)務(wù)對(duì)象,作為所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
其中,所述文檔對(duì)象類型確定單元,具體包括:
判斷模塊,用于判斷所述XML數(shù)據(jù)中是否攜帶文檔對(duì)象類型;
第一判斷結(jié)果模塊,用于當(dāng)所述判斷單元判斷出所述XML數(shù)據(jù)中攜帶了文檔對(duì)象類型時(shí),將所述XML數(shù)據(jù)攜帶的文檔對(duì)象類型確定為所述XML數(shù)據(jù)的文檔對(duì)象類型;
第二判斷結(jié)果模塊,用于當(dāng)所述判斷模塊判斷出所述XML數(shù)據(jù)中未攜帶文檔對(duì)象類型時(shí),將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為所述XML數(shù)據(jù)的文檔對(duì)象類型。
其中,所述第二判斷結(jié)果模塊,具體用于:
確定所述XML數(shù)據(jù)中的根節(jié)點(diǎn);其中所述根節(jié)點(diǎn)為所述XML數(shù)據(jù)中第一個(gè)包含開始標(biāo)記和結(jié)束標(biāo)記的節(jié)點(diǎn);將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱 確定為所述XML數(shù)據(jù)的文檔對(duì)象類型。
其中,所述裝置還包括:
讀取單元,用于從配置庫中讀取預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息;
緩存單元,用于將所述讀取單元讀取的節(jié)點(diǎn)配置信息按照其對(duì)應(yīng)的文檔對(duì)象類型存儲(chǔ)在緩存中;則
所述節(jié)點(diǎn)配置信息獲取單元,具體用于:
從所述緩存單元預(yù)先存儲(chǔ)在緩存中的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息。
本發(fā)明實(shí)施例的有益效果如下:
本發(fā)明實(shí)施例中,通過確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型,根據(jù)預(yù)先存儲(chǔ)的文檔對(duì)象類型與節(jié)點(diǎn)配置信息的對(duì)應(yīng)關(guān)系,獲取與確定的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息,再根據(jù)獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,以及將除根節(jié)點(diǎn)以外的其它節(jié)點(diǎn)的業(yè)務(wù)對(duì)象賦值給其父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象的方式,實(shí)現(xiàn)對(duì)待解析的XML數(shù)據(jù)的解析,與現(xiàn)有技術(shù)相比,能夠?qū)ML數(shù)據(jù)直接轉(zhuǎn)換為業(yè)務(wù)對(duì)象,避免了傳統(tǒng)XML解析時(shí)需要構(gòu)建文檔模型對(duì)象作為中間結(jié)果從而容易造成內(nèi)存溢出的風(fēng)險(xiǎn),并解決了在解析超大XML數(shù)據(jù)時(shí)的性能瓶頸,降低了系統(tǒng)內(nèi)存和CPU的開銷,使解析性能明顯提升。
本發(fā)明的其它特征和優(yōu)點(diǎn)將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實(shí)施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點(diǎn)可通過在所寫的說明書、權(quán)利要求書、以及附圖中所特別指出的結(jié)構(gòu)來實(shí)現(xiàn)和獲得。
附圖說明
此處所說明的附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本發(fā)明的一部分,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不 當(dāng)限定。在附圖中:
圖1為本發(fā)明實(shí)施例提供的一種XML數(shù)據(jù)的解析方法的實(shí)現(xiàn)流程圖;
圖2為本發(fā)明實(shí)施例提供的流式解析的輕量化XML解析框架的結(jié)構(gòu)示意圖;
圖3為本發(fā)明實(shí)施例提供的節(jié)點(diǎn)配置信息加載流程圖;
圖4為本發(fā)明實(shí)施例提供的特征提取流程圖;
圖5為本發(fā)明實(shí)施例提供的數(shù)據(jù)解析流程圖;
圖6為本發(fā)明實(shí)施例提供的XML數(shù)據(jù)的解析裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了解決現(xiàn)有技術(shù)中存在的問題,本發(fā)明實(shí)施例提供了一種XML數(shù)據(jù)的解析方案。該技術(shù)方案中,通過確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型,根據(jù)預(yù)先存儲(chǔ)的文檔對(duì)象類型與節(jié)點(diǎn)配置信息的對(duì)應(yīng)關(guān)系,獲取與確定的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息,再根據(jù)獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,以及將除根節(jié)點(diǎn)以外的其它節(jié)點(diǎn)的業(yè)務(wù)對(duì)象賦值給其父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象的方式,實(shí)現(xiàn)對(duì)待解析的XML數(shù)據(jù)的解析,與現(xiàn)有技術(shù)相比,能夠?qū)ML數(shù)據(jù)直接轉(zhuǎn)換為業(yè)務(wù)對(duì)象,避免了傳統(tǒng)XML解析時(shí)需要構(gòu)建文檔模型對(duì)象作為中間結(jié)果從而容易造成內(nèi)存溢出的風(fēng)險(xiǎn),并解決了在解析超大XML數(shù)據(jù)時(shí)的性能瓶頸,降低了系統(tǒng)內(nèi)存和CPU的開銷,使解析性能明顯提升。
以下結(jié)合說明書附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行說明,應(yīng)當(dāng)理解,此處所描述的實(shí)施例僅用于說明和解釋本發(fā)明,并不用于限制本發(fā)明。并且在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例的特征可以互相結(jié)合。
本發(fā)明實(shí)施例提供了一種XML數(shù)據(jù)的解析方法,如圖1所示,為該方法的實(shí)現(xiàn)流程圖,具體包括下述步驟:
步驟11,確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型。
一般來說,待解析的XML數(shù)據(jù)會(huì)指定自身的文檔對(duì)象類型,如果該待解析的XML數(shù)據(jù)沒有指定自身的文檔對(duì)象類型,那么可以根據(jù)XML數(shù)據(jù)的格式確定XML數(shù)據(jù)中的根節(jié)點(diǎn),并將根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為XML數(shù)據(jù)的文檔對(duì)象類型。其中,XML數(shù)據(jù)的根節(jié)點(diǎn)為XML數(shù)據(jù)中第一個(gè)包含開始標(biāo)記和結(jié)束標(biāo)記的節(jié)點(diǎn)。
步驟12,從預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息中,獲取與XML數(shù)據(jù)的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息;其中,節(jié)點(diǎn)配置信息中包含:節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型。
本發(fā)明實(shí)施例中,節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)用于識(shí)別XML數(shù)據(jù)中的節(jié)點(diǎn),其可以但不限于包括:節(jié)點(diǎn)名稱、節(jié)點(diǎn)的開始標(biāo)記、節(jié)點(diǎn)的結(jié)束標(biāo)記、節(jié)點(diǎn)的父節(jié)點(diǎn)和節(jié)點(diǎn)描述信息等等。
節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)的數(shù)據(jù)類型用于決定節(jié)點(diǎn)的具體解析方式,包括原始類型和對(duì)象類型,其中XML數(shù)據(jù)中的節(jié)點(diǎn)在解析時(shí)統(tǒng)一作為原始類型處理,只有在當(dāng)前節(jié)點(diǎn)是其它一個(gè)或多個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)時(shí),才將該節(jié)點(diǎn)作為對(duì)象類型處理。
其中,節(jié)點(diǎn)配置信息可以預(yù)先存儲(chǔ)在配置庫中。在執(zhí)行步驟12時(shí),可以從預(yù)先存儲(chǔ)在配置庫中的節(jié)點(diǎn)配置信息中,獲取與XML數(shù)據(jù)的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息。但是這種方式會(huì)導(dǎo)致節(jié)點(diǎn)配置信息的讀取效率過低。
因此,本發(fā)明實(shí)施例中,為了可以提高獲取節(jié)點(diǎn)配置信息的讀取效率,可以在系統(tǒng)啟動(dòng)時(shí)(即步驟11之前)自動(dòng)加載配置庫中的節(jié)點(diǎn)配置信息,并按照其對(duì)應(yīng)的文檔對(duì)象類型存儲(chǔ)至緩存中,使得當(dāng)確定了XML數(shù)據(jù)的文檔對(duì)象類型之后,可以直接根據(jù)文檔對(duì)象類型,從預(yù)先存儲(chǔ)在緩存中的節(jié)點(diǎn)配置信息中,獲取相應(yīng)的節(jié)點(diǎn)配置信息,從而提高了節(jié)點(diǎn)配置信息的讀取效率。
步驟13,對(duì)該XML數(shù)據(jù)中的每行數(shù)據(jù)依次執(zhí)行下述操作,直至解析完該XML數(shù)據(jù):
根據(jù)獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,確定 當(dāng)前行數(shù)據(jù)對(duì)應(yīng)的節(jié)點(diǎn)和該節(jié)點(diǎn)的數(shù)據(jù)類型;
根據(jù)該節(jié)點(diǎn)的數(shù)據(jù)類型,對(duì)該節(jié)點(diǎn)進(jìn)行解析,得到該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
具體的,當(dāng)該節(jié)點(diǎn)的數(shù)據(jù)類型為原始類型時(shí),獲取該節(jié)點(diǎn)的原始類型值,作為為該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
當(dāng)該節(jié)點(diǎn)的數(shù)據(jù)類型為對(duì)象類型時(shí),為該節(jié)點(diǎn)創(chuàng)建新的業(yè)務(wù)對(duì)象,作為該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
當(dāng)該節(jié)點(diǎn)不是XML數(shù)據(jù)中的根節(jié)點(diǎn)時(shí),將得到的業(yè)務(wù)對(duì)象賦值給該節(jié)點(diǎn)的父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
本發(fā)明實(shí)施例中,通過確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型,根據(jù)預(yù)先存儲(chǔ)的文檔對(duì)象類型與節(jié)點(diǎn)配置信息的對(duì)應(yīng)關(guān)系,獲取與確定的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息,再根據(jù)獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,以及將除根節(jié)點(diǎn)以外的其它節(jié)點(diǎn)的業(yè)務(wù)對(duì)象賦值給其父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象的方式,實(shí)現(xiàn)對(duì)待解析的XML數(shù)據(jù)的解析,與現(xiàn)有技術(shù)相比,能夠?qū)ML數(shù)據(jù)直接轉(zhuǎn)換為業(yè)務(wù)對(duì)象,避免了傳統(tǒng)XML解析時(shí)需要構(gòu)建文檔模型對(duì)象作為中間結(jié)果從而容易造成內(nèi)存溢出的風(fēng)險(xiǎn),并解決了在解析超大XML數(shù)據(jù)時(shí)的性能瓶頸,降低了系統(tǒng)內(nèi)存和CPU的開銷,使解析性能明顯提升。
本發(fā)明實(shí)施例提供的XML解析方法可以但不限于應(yīng)用在交易系統(tǒng)中。
為了更好的理解本發(fā)明實(shí)施例,以下結(jié)合具體的實(shí)施對(duì)本發(fā)明實(shí)施例的具體實(shí)施過程進(jìn)行說明。
在交易系統(tǒng)中,XML數(shù)據(jù)的主要目的是進(jìn)行系統(tǒng)間的信息交換。交易系統(tǒng)中的XML數(shù)據(jù)還有一個(gè)比較鮮明的特點(diǎn),就是節(jié)點(diǎn)類型基本都是元素,基本沒有屬性類型。XML數(shù)據(jù)以其自身的特點(diǎn)非常適合包裝需要交換的數(shù)據(jù),同時(shí)在交易系統(tǒng)中用戶基本不會(huì)關(guān)心其結(jié)構(gòu)化的文檔模型對(duì)象,用戶所關(guān)注的是其承載的數(shù)據(jù)。因此,在交易系統(tǒng)中用作系統(tǒng)間數(shù)據(jù)傳輸?shù)腦ML數(shù)據(jù)一般具有如下特點(diǎn):層次清楚,結(jié)構(gòu)分明,系統(tǒng)生成,自動(dòng)賦值。
根據(jù)上述XML數(shù)據(jù)的特點(diǎn),本發(fā)明實(shí)施例設(shè)計(jì)了一個(gè)流式解析的輕量化XML解析框架,其結(jié)構(gòu)如下圖2所示。其中:
1、配置庫
主要用于保存節(jié)點(diǎn)配置信息。
其中,一個(gè)節(jié)點(diǎn)對(duì)應(yīng)一條節(jié)點(diǎn)配置信息,一條典型的節(jié)點(diǎn)配置信息可以包括如下屬性:
1)文檔對(duì)象類型,用于標(biāo)識(shí)一組屬性同屬于一個(gè)待解析的XML數(shù)據(jù);
2)節(jié)點(diǎn)名稱,XML數(shù)據(jù)中節(jié)點(diǎn)與Java的業(yè)務(wù)對(duì)象綁定的紐帶,通過反射與動(dòng)態(tài)代理機(jī)制把節(jié)點(diǎn)名稱賦值給Java的業(yè)務(wù)對(duì)象;
3)節(jié)點(diǎn)描述信息;
4)節(jié)點(diǎn)類型,元素或?qū)傩裕?/p>
5)節(jié)點(diǎn)順序,節(jié)點(diǎn)在XML數(shù)據(jù)中的順序;
6)父節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的上一級(jí)節(jié)點(diǎn),一般是對(duì)象類型;父節(jié)點(diǎn)為空則為根節(jié)點(diǎn)。
7)開始標(biāo)記,標(biāo)識(shí)節(jié)點(diǎn)開始的特征字符;
8)結(jié)束標(biāo)記,標(biāo)識(shí)節(jié)點(diǎn)結(jié)束的特征字符;
9)數(shù)據(jù)類型,節(jié)點(diǎn)對(duì)應(yīng)的Java數(shù)據(jù)類型,分原始類型與對(duì)象類型兩種;字符串因其特殊性在處理時(shí)也作為原始類型看待;
10)是否復(fù)數(shù),如果節(jié)點(diǎn)在同一個(gè)父節(jié)點(diǎn)下多次出現(xiàn),認(rèn)為其是復(fù)數(shù)形式,在父節(jié)點(diǎn)中會(huì)以數(shù)組保存;
11)是否為根節(jié)點(diǎn)。
2、配置管理模塊
在系統(tǒng)啟動(dòng)時(shí)自動(dòng)加載配置庫中的節(jié)點(diǎn)配置信息,并按照文檔對(duì)象類型把配置庫整理為一個(gè)個(gè)獨(dú)立的單元并放到緩存中管理。當(dāng)解析時(shí)需要用到節(jié)點(diǎn)配置信息時(shí),直接根據(jù)文檔對(duì)象類型到緩存中讀取對(duì)應(yīng)的節(jié)點(diǎn)配置信息,避免每次都去讀取配置庫,從而提高加載節(jié)點(diǎn)配置信息的效率。
3、特征提取模塊
當(dāng)接收的XML數(shù)據(jù)沒有指定文檔對(duì)象類型時(shí),根據(jù)XML格式特點(diǎn)自動(dòng)提取根節(jié)點(diǎn)的節(jié)點(diǎn)名稱,并根據(jù)根節(jié)點(diǎn)的節(jié)點(diǎn)名稱自動(dòng)加載對(duì)應(yīng)的節(jié)點(diǎn)配置信息。
4、數(shù)據(jù)解析模塊
該模塊是整個(gè)解析框架的關(guān)鍵部分,它以流式順序解析XML數(shù)據(jù)中的內(nèi)容。首先根據(jù)根節(jié)點(diǎn)生成業(yè)務(wù)對(duì)象,然后把解析到的其它節(jié)點(diǎn)按照其數(shù)據(jù)類型,以反射與動(dòng)態(tài)代理的方式把它們的業(yè)務(wù)對(duì)象賦值給它們的父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
5、對(duì)象生成模塊
把解析到的所有業(yè)務(wù)對(duì)象以數(shù)組的形式返回給調(diào)用者。
在上述解析框架的基礎(chǔ)上,下面分別對(duì)節(jié)點(diǎn)配置信息加載流程、特征提取流程和XML數(shù)據(jù)解析流程進(jìn)行介紹。
如圖3所示,為節(jié)點(diǎn)配置信息加載流程圖。具體流程包括:
步驟31,在系統(tǒng)啟動(dòng)時(shí),首先獲取配置路徑;
步驟32,根據(jù)獲取的配置路徑從配置庫中讀取所有的節(jié)點(diǎn)配置信息;
步驟33,對(duì)讀取的所有的節(jié)點(diǎn)配置信息進(jìn)行整理,將節(jié)點(diǎn)配置信息按照文檔對(duì)象類型整理成一個(gè)個(gè)獨(dú)立單元;
步驟34,將每個(gè)獨(dú)立單元以文檔對(duì)象類型為鍵值存儲(chǔ)在緩存中。
如圖4所示,為特征提取流程圖。具體流程包括:
步驟41,判斷XML數(shù)據(jù)是否攜帶文檔對(duì)象類型;如果該XML數(shù)據(jù)攜帶文檔對(duì)象類型,則執(zhí)行步驟45;如果該XML數(shù)據(jù)未攜帶文檔對(duì)象類型,則執(zhí)行步驟42。
步驟42,確定XML數(shù)據(jù)中第一個(gè)包含開始標(biāo)記和結(jié)束標(biāo)記的節(jié)點(diǎn)。
具體的,確定過程可以采用排除法,首先去掉空串,排除XML數(shù)據(jù)中的頭信息,架構(gòu)信息等。當(dāng)找到第一個(gè)包含開始標(biāo)記和結(jié)束標(biāo)記的節(jié)點(diǎn)時(shí),即認(rèn)為其是根節(jié)點(diǎn)。
步驟43,確定該節(jié)點(diǎn)的節(jié)點(diǎn)名稱。
步驟44,將該節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為XML數(shù)據(jù)的文檔對(duì)象類型。
步驟45,將其攜帶的文檔對(duì)象類型確定為該XML數(shù)據(jù)的文檔對(duì)象類型。
如圖5所示,為數(shù)據(jù)解析流程圖。具體流程包括:
步驟51,確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型;
步驟52,從預(yù)先存儲(chǔ)在緩存中的節(jié)點(diǎn)配置信息中,獲取與確定的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息;
步驟53,讀取XML數(shù)據(jù)行;
步驟54,將獲取的節(jié)點(diǎn)配置信息與讀取的XML數(shù)據(jù)行進(jìn)行匹配,直至確定出與讀取的XML數(shù)據(jù)行匹配的節(jié)點(diǎn)配置信息,確定讀取的XML數(shù)據(jù)行對(duì)應(yīng)的節(jié)點(diǎn)和該節(jié)點(diǎn)的數(shù)據(jù)類型;當(dāng)節(jié)點(diǎn)的數(shù)據(jù)類型為原始類型時(shí),執(zhí)行步驟55,當(dāng)節(jié)點(diǎn)的數(shù)據(jù)類型為對(duì)象類型時(shí),執(zhí)行步驟56。
步驟55,獲取該節(jié)點(diǎn)的原始類型值,作為為該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
步驟56,為該節(jié)點(diǎn)創(chuàng)建新的業(yè)務(wù)對(duì)象,作為該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
具體的,可以根據(jù)該節(jié)點(diǎn)的節(jié)點(diǎn)名稱為該節(jié)點(diǎn)創(chuàng)建新的業(yè)務(wù)對(duì)象,作為該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
步驟57,判斷該節(jié)點(diǎn)是否為XML數(shù)據(jù)的根節(jié)點(diǎn);如果該節(jié)點(diǎn)為XML數(shù)據(jù)的根節(jié)點(diǎn),則執(zhí)行步驟58,如果該節(jié)點(diǎn)不為XML數(shù)據(jù)的根節(jié)點(diǎn),則執(zhí)行步驟59。
步驟58,將該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象添加到數(shù)組中;
步驟59,將該節(jié)點(diǎn)的業(yè)務(wù)對(duì)象賦值給該節(jié)點(diǎn)的父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
步驟510,判斷是否解析完該XML數(shù)據(jù),如果沒有解析完該XML數(shù)據(jù),則返回繼續(xù)執(zhí)行步驟53,如果解析完該XML數(shù)據(jù),則執(zhí)行步驟511。
步驟511,將解析結(jié)果返回。
本發(fā)明實(shí)施例中,通過確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型,根據(jù)預(yù)先存儲(chǔ)的文檔對(duì)象類型與節(jié)點(diǎn)配置信息的對(duì)應(yīng)關(guān)系,獲取與確定的文檔對(duì)象類 型對(duì)應(yīng)的節(jié)點(diǎn)配置信息,再根據(jù)獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,以及將除根節(jié)點(diǎn)以外的其它節(jié)點(diǎn)的業(yè)務(wù)對(duì)象賦值給其父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象的方式,實(shí)現(xiàn)對(duì)待解析的XML數(shù)據(jù)的解析,與現(xiàn)有技術(shù)相比,能夠?qū)ML數(shù)據(jù)直接轉(zhuǎn)換為業(yè)務(wù)對(duì)象,避免了傳統(tǒng)XML解析時(shí)需要構(gòu)建文檔模型對(duì)象作為中間結(jié)果從而容易造成內(nèi)存溢出的風(fēng)險(xiǎn),并解決了在解析超大XML數(shù)據(jù)時(shí)的性能瓶頸,降低了系統(tǒng)內(nèi)存和CPU的開銷,使解析性能明顯提升。
基于同一發(fā)明構(gòu)思,本發(fā)明實(shí)施例中還提供了一種XML數(shù)據(jù)的解析裝置,由于上述裝置解決問題的原理與XML數(shù)據(jù)的解析方法相似,因此上述裝置的實(shí)施可以參見方法的實(shí)施,重復(fù)之處不再贅述。
如圖6所示,為本發(fā)明實(shí)施例提供的XML數(shù)據(jù)的解析裝置的結(jié)構(gòu)示意圖,包括:
文檔對(duì)象類型確定單元61,用于確定待解析的XML數(shù)據(jù)的文檔對(duì)象類型;
節(jié)點(diǎn)配置信息獲取單元62,用于從預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型確定單元61確定的文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息;其中,所述節(jié)點(diǎn)配置信息中包含:節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型;
解析單元63,用于對(duì)所述XML數(shù)據(jù)中的每行數(shù)據(jù)依次執(zhí)行下述操作,直至解析完所述XML數(shù)據(jù):
根據(jù)所述節(jié)點(diǎn)配置信息獲取單元62獲取的節(jié)點(diǎn)配置信息中包含的節(jié)點(diǎn)特征數(shù)據(jù)和節(jié)點(diǎn)的數(shù)據(jù)類型,確定當(dāng)前行數(shù)據(jù)對(duì)應(yīng)的節(jié)點(diǎn)和所述節(jié)點(diǎn)的數(shù)據(jù)類型;根據(jù)所述節(jié)點(diǎn)的數(shù)據(jù)類型,對(duì)所述節(jié)點(diǎn)進(jìn)行解析,得到所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;當(dāng)所述節(jié)點(diǎn)不是所述XML數(shù)據(jù)中的根節(jié)點(diǎn)時(shí),將得到的業(yè)務(wù)對(duì)象賦值給所述節(jié)點(diǎn)的父節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
其中,所述解析單元63,具體用于:
當(dāng)所述節(jié)點(diǎn)的數(shù)據(jù)類型為原始類型時(shí),獲取所述節(jié)點(diǎn)的原始類型值,作為為所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象;
當(dāng)所述節(jié)點(diǎn)的數(shù)據(jù)類型為對(duì)象類型時(shí),為所述節(jié)點(diǎn)創(chuàng)建新的業(yè)務(wù)對(duì)象,作為所述節(jié)點(diǎn)的業(yè)務(wù)對(duì)象。
其中,所述文檔對(duì)象類型確定單元61,具體包括:
判斷模塊611,用于判斷所述XML數(shù)據(jù)中是否攜帶文檔對(duì)象類型;
第一判斷結(jié)果模塊612,用于當(dāng)所述判斷單元611判斷出所述XML數(shù)據(jù)中攜帶了文檔對(duì)象類型時(shí),將所述XML數(shù)據(jù)攜帶的文檔對(duì)象類型確定為所述XML數(shù)據(jù)的文檔對(duì)象類型;
第二判斷結(jié)果模塊613,用于當(dāng)所述判斷模塊611判斷出所述XML數(shù)據(jù)中未攜帶文檔對(duì)象類型時(shí),將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為所述XML數(shù)據(jù)的文檔對(duì)象類型。
其中,所述第二判斷結(jié)果模塊613,具體用于:
確定所述XML數(shù)據(jù)中的根節(jié)點(diǎn);其中所述根節(jié)點(diǎn)為所述XML數(shù)據(jù)中第一個(gè)包含開始標(biāo)記和結(jié)束標(biāo)記的節(jié)點(diǎn);將所述XML數(shù)據(jù)的根節(jié)點(diǎn)的節(jié)點(diǎn)名稱確定為所述XML數(shù)據(jù)的文檔對(duì)象類型。
其中,所述裝置還包括:
讀取單元64,用于從配置庫中讀取預(yù)先存儲(chǔ)的節(jié)點(diǎn)配置信息;
緩存單元65,用于將所述讀取單元64讀取的節(jié)點(diǎn)配置信息按照其對(duì)應(yīng)的文檔對(duì)象類型存儲(chǔ)在緩存中;則
所述節(jié)點(diǎn)配置信息獲取單元62,具體用于:
從所述緩存單元65預(yù)先存儲(chǔ)在緩存中的節(jié)點(diǎn)配置信息中,獲取與所述文檔對(duì)象類型對(duì)應(yīng)的節(jié)點(diǎn)配置信息。
為了描述的方便,以上各部分按照功能劃分為各模塊(或單元)分別描述。當(dāng)然,在實(shí)施本發(fā)明時(shí)可以把各模塊(或單元)的功能在同一個(gè)或多個(gè)軟件或硬件中實(shí)現(xiàn)。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié) 合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。