一種XML解析方法及醫(yī)療病案中自定義XML結(jié)構(gòu)表單實現(xiàn)方法[技術(shù)領(lǐng)域]本發(fā)明涉及數(shù)據(jù)庫技術(shù),具體是一種XML解析方法以及在Android終端上醫(yī)療病案中自定義XML結(jié)構(gòu)表單的實現(xiàn)方法,完成了基于醫(yī)療病案的自定義XML結(jié)構(gòu)表單的實現(xiàn),且將形式各異的醫(yī)療表單需要的XML結(jié)構(gòu)生成方式和XML解析方式統(tǒng)一化。[
背景技術(shù):]可擴(kuò)展標(biāo)記語言(ExtensibleMarkupLanguage,XML)廣泛用在網(wǎng)絡(luò)服務(wù)、數(shù)據(jù)庫和文件處理等領(lǐng)域。XML具有文檔內(nèi)容和結(jié)構(gòu)完全分離、互操作性強(qiáng)、規(guī)范統(tǒng)一、支持多種編碼和可擴(kuò)展性好等特點。由于XML文檔包括多層嵌套的數(shù)據(jù)結(jié)構(gòu),因此XML解析通常會比較復(fù)雜。尤其是應(yīng)用到醫(yī)療業(yè)務(wù)領(lǐng)域,往往因為涉及到醫(yī)療業(yè)務(wù)中大量的數(shù)據(jù)和表單,如病人的病史、檢查、化驗的表單等,這些表單種類繁多而且形式各異,表單的內(nèi)容都是接收后臺傳送的XML或jason格式的數(shù)據(jù),然后通過解析獲得,因此不同的表單就對應(yīng)了不同的XML或jason格式,除此之外每種表單中設(shè)計的字段也不是始終不變的,可能會根據(jù)實際需求表單的樣式會發(fā)生改變,這種不確定性對常規(guī)XML解析方法的適用時會產(chǎn)生問題。尤其當(dāng)需要在Android系統(tǒng)終端上實現(xiàn)XML數(shù)據(jù)解析時,常規(guī)XML解析方法有DOM(DocumentObjectModel文檔對象模型)方式、SAX(SimpleAPIForXML簡易應(yīng)用程序接口)方式和Android自帶的Pull方式。其中DOM解析器是完全加載后才能解析,占用內(nèi)存較多;SAX占用內(nèi)存少,解析器可以隨時加載隨時解析,但卻難以回訪。Pull解析和SAX類似,不同的是SAX解析器的工作方式是自動將事件推入注冊的事件處理器進(jìn)行處理,不能控制事件的處理主動結(jié)束;而Pull解析器的工作方式為允許應(yīng)用程序代碼主動從解析器中獲取事件,正因為是主動獲取事件,因此可以在滿足了需要的條件后不再獲取事件,結(jié)束解析。三種解析方式各有各自的優(yōu)點,其中相對來說Pull解析最簡單,可根據(jù)實際需求選擇解析方式。不論何種方式,一般XML數(shù)據(jù)進(jìn)行解析時,需要知道被解析的XML數(shù)據(jù)的各個標(biāo)簽的名稱,解析過程中判斷解析到的標(biāo)簽名稱和已知名稱是否相同,如相同取出該標(biāo)簽的內(nèi)容,采用此種方式的缺點就是不同的XML數(shù)據(jù)需要編寫不同的解析代碼,工作量很大;其次,如若將XML劃分為相同大小的多個數(shù)據(jù)塊,然后通過多核處理器的多個核同時分別對多個數(shù)據(jù)塊進(jìn)行并行的解析處理,會使得一個XML元素的內(nèi)容可能分布在不同的塊中,解析程序只能以推測的方式解析這樣的數(shù)據(jù),此外在并行解析多個數(shù)據(jù)塊時,需要檢查各個數(shù)據(jù)塊之間的數(shù)據(jù)依賴關(guān)系,從而導(dǎo)致并解析線程間的頻繁通信,當(dāng)線程等待通信應(yīng)答時,將暫停運行或減緩處理速度,從而使得并行處理的效果受到影響。[
技術(shù)實現(xiàn)要素:]本發(fā)明的目的是在現(xiàn)有Android終端上自帶的關(guān)于XML數(shù)據(jù)的Pull解析方法的基礎(chǔ)上進(jìn)行改進(jìn),提供一種不需要知道XML數(shù)據(jù)的標(biāo)簽名稱,而只需要一個通用的XML解析代碼就可解析出不同形式的XML數(shù)據(jù)的方法,以提高XML解析的解析速度,在Android終端上實現(xiàn)醫(yī)療業(yè)務(wù)。為實現(xiàn)上述目的,設(shè)計一種XML解析方法,其特征在于所述解析方法的步驟如下:1)解析模塊讀取調(diào)用外接數(shù)據(jù)庫接口Webservice接口,獲得返回的XML數(shù)據(jù);2)判斷讀取到的XML節(jié)點類型;3)節(jié)點處理操作,定義一個節(jié)點結(jié)構(gòu)體NodeStruct,包括節(jié)點類型nodeType、節(jié)點名稱nodeName和內(nèi)容類型contentType三個字符串String類型的私有屬性,并新建一個表單容器List用來存放NodeStruct類型的對象,即Lsit<NodeStruct>,在解析過程中每遇到節(jié)點類型都新建立一個NodeStruct對象,并根據(jù)節(jié)點類型分別對三個私有屬性進(jìn)行賦值;4)把新建并已賦好值的NodeStruct對象添加到表單容器List中;5)判斷XML數(shù)據(jù)是否讀取完畢,如果判斷到了XML結(jié)束文檔處,執(zhí)行第6個步驟,否則返回到第1個步驟,繼續(xù)讀取XML數(shù)據(jù);6)讀取表單容器List中的內(nèi)容并繪制表單,表單上的字段名稱以及表單上字段內(nèi)容的類型都存在List容器中的NodeStruct對象的私有屬性中,讀取出表單的字段名稱,然后根據(jù)具體的表單樣式采用代碼的形式動態(tài)繪制界面。一種用上述XML解析方法實現(xiàn)醫(yī)療病案中自定義XML結(jié)構(gòu)表單的實現(xiàn)方法,由XML封裝、XML解析兩部分構(gòu)成,所述XML封裝方法步驟為:1)XML節(jié)點管理模塊,從系統(tǒng)數(shù)據(jù)庫中的節(jié)點表中獲取醫(yī)療病案表單中的字段;XML節(jié)點管理模塊起到管理和維護(hù)表單中用到的所有字段的作用;2)把字段的名稱和各種屬性在pc機(jī)上用圖形化的方式顯示出來;3)用戶在pc機(jī)的圖形界面上選擇表單需要的字段名稱;4)生成含有用戶已選擇的字段的XML模板;5)用第四步生成的XML構(gòu)建外接數(shù)據(jù)庫接口webservice接口;所述XML解析方法步驟為:1)解析模塊讀取調(diào)用外接數(shù)據(jù)庫接口Webservice接口,獲得返回的XML數(shù)據(jù);2)判斷讀取到的XML節(jié)點類型;3)節(jié)點處理操作,定義一個節(jié)點結(jié)構(gòu)體NodeStruct,包括節(jié)點類型nodeType、節(jié)點名稱nodeName和內(nèi)容類型contentType三個字符串String類型的私有屬性,并新建一個表單容器List用來存放NodeStruct類型的對象,即Lsit<NodeStruct>,在解析過程中每遇到節(jié)點段都新建立一個NodeStruct對象,并根據(jù)節(jié)點段類型分別對三個私有屬性進(jìn)行賦值;4)把新建并已賦好值的NodeStruct對象添加到表單容器List中;5)判斷XML數(shù)據(jù)是否讀取完畢,如果判斷到了XML結(jié)束文檔處,執(zhí)行第6個步驟,否則返回到第1個步驟,繼續(xù)讀取XML數(shù)據(jù);6)讀取表單容器List中的內(nèi)容并繪制表單,表單上的字段名稱以及表單上字段內(nèi)容的類型都存在List容器中的NodeStruct對象的私有屬性中,讀取出表單的字段名稱,然后根據(jù)具體的表單樣式采用代碼的形式動態(tài)繪制界面。所述每一個外接數(shù)據(jù)庫接口Webservice接口對應(yīng)一種表單樣式。所述的節(jié)點類型分為開始標(biāo)簽、文本標(biāo)簽和結(jié)束標(biāo)簽。所述節(jié)點段分為開始段、文本段及結(jié)束段,所述的賦值操作,當(dāng)遇到節(jié)點開始段時,節(jié)點類型nodeType賦值為START,節(jié)點名稱nodeName賦值為解析得到的標(biāo)簽名稱,內(nèi)容類型contentType賦值為解析屬性type得到的內(nèi)容;遇到節(jié)點文本段時,判斷文本段是否有內(nèi)容,若是有則節(jié)點類型nodeType賦值為TEXT,節(jié)點名稱nodeName賦值為解析得到的標(biāo)簽內(nèi)容,否則不做處理;若是遇到節(jié)點結(jié)束段時,節(jié)點類型nodeType賦值為END,節(jié)點名稱nodeName賦值為解析得到的標(biāo)簽名稱。所述的XML解析在Android平臺下實現(xiàn),編程語言為java。本發(fā)明提出了一種基于醫(yī)療病案的自定義XML結(jié)構(gòu)表單的生成方法,這種方法可根據(jù)各種表單的需求字段動態(tài)生成合適XML結(jié)構(gòu)模板,并解析出需要的字段,在android終端上繪制出形式各異的表單樣式,使用這種方法大大降低了程序員的開發(fā)難度,并且提高了開發(fā)效率。采用此方案前,項目工程大小大概為8M字節(jié)。采用此方案后,項目工程大小為7.06M字節(jié),并且程序的運行效率提高了大概10%,因此證明此方案是可行的。[附圖說明]圖1:自定義XML結(jié)構(gòu)表單實現(xiàn)方法的流程框圖;圖2:XML數(shù)據(jù)中字符串的封裝流程圖;圖3:XML數(shù)據(jù)的解析流程圖;指定圖1為摘要附圖。[具體實施方式]現(xiàn)結(jié)合附圖及具體實施例對本發(fā)明的技術(shù)方案作進(jìn)一步闡述,相信對本領(lǐng)域技術(shù)人員來說是清楚的。本發(fā)明主要由兩部分構(gòu)成如圖1所示,PC機(jī)上的XML封裝操作和Android終端上的XML解析,XML的封裝主要是根據(jù)用戶選定的XML節(jié)點名稱,動態(tài)生成適合各種醫(yī)療病案表單的XML結(jié)構(gòu),XML封裝的結(jié)構(gòu)組成圖如圖2所示;XML解析在Android平臺下實現(xiàn),編程語言為java,采用改進(jìn)后的Pull解析方法進(jìn)行。XML封裝方法是利用封裝模塊在PC機(jī)上實現(xiàn),采用C#語言編程,其方法步驟如圖2所示:1)醫(yī)療系統(tǒng)數(shù)據(jù)庫包括系統(tǒng)數(shù)據(jù)庫和外接的數(shù)據(jù)庫接口兩部分,外接數(shù)據(jù)庫接口可以是醫(yī)院數(shù)據(jù)庫接口或HIS系統(tǒng)的接口等其它醫(yī)療系統(tǒng)接口,該接口用來提供醫(yī)療病案表單需要的節(jié)點名稱。在系統(tǒng)數(shù)據(jù)庫內(nèi)包含節(jié)點表,外接的數(shù)據(jù)庫接口中包含字段,系統(tǒng)數(shù)據(jù)庫節(jié)點表中的節(jié)點名稱字段與外接數(shù)據(jù)庫接口中的相關(guān)字段相對應(yīng)的。XML節(jié)點管理模塊對數(shù)據(jù)庫表單中用到的所有字段起到管理和維護(hù)作用,XML節(jié)點管理模塊從系統(tǒng)數(shù)據(jù)庫中的節(jié)點表中獲取醫(yī)療病案表單中的字段;2)把字段的名稱和各種屬性在pc機(jī)上用圖形化的方式顯示出來;3)用戶在pc機(jī)的圖形界面上選擇表單需要的字段名稱;4)生成含有用戶已選擇的字段的XML模板;5)用第四步生成的XML構(gòu)建外接數(shù)據(jù)庫接口webservice接口;XML解析,解析模塊調(diào)用Webservice接口,并對獲取到的返回數(shù)據(jù)進(jìn)行解析,得到表單的字段名稱,然后根據(jù)表單樣式,動態(tài)的用代碼進(jìn)行界面布局,在終端界面上顯示出來。解析是在Android系統(tǒng)終端上實現(xiàn),Android解析XML數(shù)據(jù)可以采用DOM(DocumentObjectModel文檔對象模型)方式、SAX(SimpleAPIForXML簡易應(yīng)用程序接口)方式和Android自帶的Pull方式。其中DOM解析器是完全加載后才能解析,占用內(nèi)存較多;SAX占用內(nèi)存少,解析器可以隨時加載隨時解析,但卻難以回訪。Pull解析和SAX類似,不同的是SAX解析器的工作方式是自動將事件推入注冊的事件處理器進(jìn)行處理,不能控制事件的處理主動結(jié)束;而Pull解析器的工作方式為允許應(yīng)用程序代碼主動從解析器中獲取事件,正因為是主動獲取事件,因此可以在滿足了需要的條件后不再獲取事件,結(jié)束解析。三種解析方式各有各自的優(yōu)點,其中相對來說Pull解析最簡單,可根據(jù)實際需求選擇解析方式。在這里我們采用Android自帶的Pull解析方式。XML解析方法是利用解析模塊在Android終端平臺上實現(xiàn)的,采用java編程語言,其方法步驟如圖3所示:1)解析模塊讀取調(diào)用外接數(shù)據(jù)庫接口Webservice接口,獲得返回的XML數(shù)據(jù);其中每一個外接數(shù)據(jù)庫接口Webservice接口對應(yīng)了一種表單樣式。2)判斷讀取到的XML節(jié)點類型;所述的節(jié)點類型分為開始標(biāo)簽、文本標(biāo)簽和結(jié)束標(biāo)簽。以<item>男</item>為例說明,其中<item>為開始標(biāo)簽,<item>標(biāo)簽的內(nèi)容“男”就是文本標(biāo)簽,</item>為結(jié)束標(biāo)簽;3)節(jié)點處理操作,定義一個節(jié)點結(jié)構(gòu)體NodeStruct,包括節(jié)點類型nodeType、節(jié)點名稱nodeName和內(nèi)容類型contentType三個字符串String類型的私有屬性,并新建一個表單容器List用來存放NodeStruct類型的對象,即Lsit<NodeStruct>,在解析過程中每遇到節(jié)點段都新建立一個NodeStruct對象,并根據(jù)節(jié)點段類型分別對三個私有屬性進(jìn)行賦值;所述節(jié)點段分為開始段、文本段及結(jié)束段,所述的賦值操作,當(dāng)遇到節(jié)點開始段時,節(jié)點類型nodeType賦值為START,節(jié)點名稱nodeName賦值為解析得到的標(biāo)簽名稱,內(nèi)容類型contentType賦值為解析屬性type得到的內(nèi)容;遇到節(jié)點文本段時,判斷文本段是否有內(nèi)容,若是有則節(jié)點類型nodeType賦值為TEXT,節(jié)點名稱nodeName賦值為解析得到的標(biāo)簽內(nèi)容,否則不做處理;若是遇到節(jié)點結(jié)束段時,節(jié)點類型nodeType賦值為END,節(jié)點名稱nodeName賦值為解析得到的標(biāo)簽名稱。4)把新建并已賦好值的NodeStruct對象添加到表單容器List中;5)判斷XML數(shù)據(jù)是否讀取完畢,如果判斷到了XML結(jié)束文檔處,執(zhí)行第6個步驟,否則返回到第1個步驟,繼續(xù)讀取XML數(shù)據(jù);6)讀取表單容器List中的內(nèi)容并繪制表單,表單上的字段名稱以及表單上字段內(nèi)容的類型都存在List容器中的NodeStruct對象的私有屬性中,讀取出表單的字段名稱,然后根據(jù)具體的表單樣式采用代碼的形式動態(tài)繪制界面。