本發(fā)明涉及語(yǔ)言解析技術(shù),尤其涉及一種XML文檔解析方法及裝置。
背景技術(shù):
目前,可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Language,簡(jiǎn)稱XML)得到了廣泛的應(yīng)用,而其中XML解析技術(shù)是XML應(yīng)用的關(guān)鍵。具體地,XML本身只是以純文本對(duì)數(shù)據(jù)進(jìn)行編碼的一種格式,要想利用XML,或者說(shuō)利用XML文件中所編碼的數(shù)據(jù),必須先將數(shù)據(jù)從純文本中解析出來(lái),因此,必須有一個(gè)能夠識(shí)別XML文檔中信息的解析器,用來(lái)解釋XML文檔并提取其中的數(shù)據(jù)。然而,根據(jù)數(shù)據(jù)提取的不同需求,又存在著多種解析方式,不同的解析方式有著各自的優(yōu)缺點(diǎn)和適用環(huán)境。選擇合適的XML解析技術(shù)能夠有效提升應(yīng)用系統(tǒng)的整體性能。
現(xiàn)有技術(shù)中常用的XML解析技術(shù)有文檔對(duì)象模型(Document Object Model,簡(jiǎn)稱DOM)技術(shù),具體地,采用DOM技術(shù)解析XML文檔時(shí),需要先讀取整個(gè)XML文檔,然后再對(duì)整個(gè)XML文檔進(jìn)行解析處理。
但是,采用現(xiàn)有的DOM技術(shù)解析XML文檔,會(huì)占用計(jì)算機(jī)的大量?jī)?nèi)存,對(duì)于大容量的XML文檔,甚至?xí)?dǎo)致內(nèi)存溢出。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種XML文檔解析方法及裝置,用于解決現(xiàn)有解析XML文檔的方法占用內(nèi)存過(guò)大的問(wèn)題。
本發(fā)明第一方面提供一種XML文檔解析方法,包括:
獲取可擴(kuò)展標(biāo)記語(yǔ)言XML文檔讀取指令,所述讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí);
根據(jù)所述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出所述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù);
將所述至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù),其中,所述至少一行數(shù)據(jù)中的元素和屬性成為所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn);
對(duì)所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取所述XML文檔的解析結(jié)果。
本發(fā)明第二方面提供一種XML文檔解析裝置,包括:
獲取模塊,用于獲取可擴(kuò)展標(biāo)記語(yǔ)言XML文檔讀取指令,所述讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí);
讀取模塊,用于根據(jù)所述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出所述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù);
轉(zhuǎn)換模塊,用于將所述至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù),其中,所述至少一行數(shù)據(jù)中的元素和屬性成為所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn);
解析模塊,用于對(duì)所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取所述XML文檔的解析結(jié)果。
本發(fā)明提供的XML文檔解析方法及裝置,獲取XML文檔讀取指令,該讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí),根據(jù)上述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù),并將這至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù),對(duì)該節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)進(jìn)行解析,獲取解析結(jié)果,實(shí)現(xiàn)了只需要根據(jù)讀取指令讀取需要讀取的行數(shù)據(jù)即可,而無(wú)需讀取整個(gè)文檔,大大降低了計(jì)算機(jī)內(nèi)存的消耗,避免了內(nèi)存溢出的現(xiàn)象,另外,只需要將讀取的行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù)進(jìn)行解析,還可以提高解析效率。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明提供的XML文檔解析方法實(shí)施例一的流程示意圖;
圖2為本發(fā)明提供的XML文檔解析裝置實(shí)施例一的結(jié)構(gòu)示意圖;
圖3為本發(fā)明提供的XML文檔解析裝置實(shí)施例二的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
圖1為本發(fā)明提供的XML文檔解析方法實(shí)施例一的流程示意圖,如圖1所示,該方法包括:
S101、獲取XML文檔讀取指令,該讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí)。
一般地,用于讀取XML文檔的讀取指令可以是一段程序,這段程序中指示了待讀取的XML文檔中需要讀取的部分,具體地,可以通過(guò)待讀取行標(biāo)識(shí)來(lái)指示。
S102、根據(jù)上述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)。
需要說(shuō)明的是,XML文檔由多行數(shù)據(jù)組成,可以以每行的行號(hào)或者關(guān)鍵詞作為標(biāo)識(shí),讀取的時(shí)候?qū)⒆x取指令中的待讀取行標(biāo)識(shí)與各行數(shù)據(jù)的標(biāo)識(shí)進(jìn)行匹配,以讀取出上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)。
具體地,可以將讀取出的上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)先緩存在字符串緩存(stringbuffer)空間內(nèi)。
S103、將上述至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù)。其中,上述至少一行數(shù)據(jù)中的元素和屬性成為該節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)。
在將上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)都讀取完后,將stringbuffer中的數(shù)據(jù)構(gòu)建為節(jié)點(diǎn)樹(shù)。具體構(gòu)建過(guò)程中,可以直接按照XML文檔原本的邏輯關(guān)系進(jìn)行構(gòu)建,即將XML文檔中各元素、屬性之間的父子關(guān)系、兄弟關(guān)系等呈現(xiàn)為節(jié)點(diǎn)樹(shù)即可。
S104、對(duì)上述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取該XML文檔的解析結(jié)果。具體對(duì)節(jié)點(diǎn)進(jìn)行解析的過(guò)程在此不作限制。
本實(shí)施例中,獲取XML文檔讀取指令,該讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí),根據(jù)上述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù),并將這至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié) 點(diǎn)樹(shù),對(duì)該節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)進(jìn)行解析,獲取解析結(jié)果,實(shí)現(xiàn)了只需要根據(jù)讀取指令讀取需要讀取的行數(shù)據(jù)即可,而無(wú)需讀取整個(gè)文檔,大大降低了計(jì)算機(jī)內(nèi)存的消耗,避免了內(nèi)存溢出的現(xiàn)象,另外,只需要將讀取的行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù)進(jìn)行解析,還可以提高解析效率。
具體地,上述根據(jù)上述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù),可以是,根據(jù)上述至少一個(gè)待讀取行標(biāo)識(shí),從上述XML文檔的第一行數(shù)據(jù)開(kāi)始,逐行遍歷該XML文檔,依次從該XML文檔中讀取上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)。具體讀取過(guò)程中,讀到某行數(shù)據(jù)時(shí),看該行數(shù)據(jù)的標(biāo)識(shí)與上述至少一個(gè)待讀取行標(biāo)識(shí)中的某個(gè)待讀取行標(biāo)識(shí)相同,則將這行數(shù)據(jù)讀取出,暫存于stringbuffer空間內(nèi)。更具體地,每讀取一行數(shù)據(jù),就將這行數(shù)據(jù)插入stringbuffer空間內(nèi),直到將上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)全部讀取完則停止讀取。
進(jìn)一步地,上述對(duì)上述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取該XML文檔的解析結(jié)果,具體可以是:遍歷該節(jié)點(diǎn)樹(shù)上的所有節(jié)點(diǎn),依次對(duì)各節(jié)點(diǎn)進(jìn)行解析,獲取該XML文檔的解析結(jié)果。具體實(shí)現(xiàn)過(guò)程中,對(duì)節(jié)點(diǎn)對(duì)應(yīng)的元素、或者屬性進(jìn)行解析,生成對(duì)象存入內(nèi)存中。
為了更好的節(jié)約內(nèi)存資源,在上述對(duì)上述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取該XML文檔的解析結(jié)果之后,將所讀取的上述至少一行數(shù)據(jù)進(jìn)行釋放。具體地,將上述stringbuffer空間內(nèi)臨時(shí)存儲(chǔ)的上述至少一行數(shù)據(jù)進(jìn)行釋放,以節(jié)約空間。
圖2為本發(fā)明提供的XML文檔解析裝置實(shí)施例一的結(jié)構(gòu)示意圖,如圖2所示,該裝置包括:獲取模塊201、讀取模塊202、轉(zhuǎn)換模塊203和解析模塊204,其中:
獲取模塊201,用于獲取可擴(kuò)展標(biāo)記語(yǔ)言XML文檔讀取指令,所述讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí)。
讀取模塊202,用于根據(jù)所述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出所述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)。
轉(zhuǎn)換模塊203,用于將所述至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù),其中,所述至少一行數(shù)據(jù)中的元素和屬性成為所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)。
解析模塊204,用于對(duì)所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取所述XML文檔的解析結(jié)果。
本實(shí)施例中,獲取XML文檔讀取指令,該讀取指令中包括至少一個(gè)待讀取行標(biāo)識(shí),根據(jù)上述至少一個(gè)待讀取行標(biāo)識(shí),在XML文檔中讀取出上述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù),并將這至少一行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù),對(duì)該節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)進(jìn)行解析,獲取解析結(jié)果,實(shí)現(xiàn)了只需要根據(jù)讀取指令讀取需要讀取的行數(shù)據(jù)即可,而無(wú)需讀取整個(gè)文檔,大大降低了計(jì)算機(jī)內(nèi)存的消耗,避免了內(nèi)存溢出的現(xiàn)象,另外,只需要將讀取的行數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)樹(shù)進(jìn)行解析,還可以提高解析效率。
進(jìn)一步地,讀取模塊202,具體用于根據(jù)所述至少一個(gè)待讀取行標(biāo)識(shí),從所述XML文檔的第一行數(shù)據(jù)開(kāi)始,逐行遍歷所述XML文檔,并依次從所述XML文檔中讀取出所述至少一個(gè)待讀取行標(biāo)識(shí)對(duì)應(yīng)的至少一行數(shù)據(jù)。
解析模塊204,具體用于遍歷所述節(jié)點(diǎn)樹(shù)上的所有節(jié)點(diǎn),依次對(duì)各所述節(jié)點(diǎn)進(jìn)行解析,獲取所述XML文檔的解析結(jié)果。
圖3為本發(fā)明提供的XML文檔解析裝置實(shí)施例二的結(jié)構(gòu)示意圖,如圖3所示,在圖2的基礎(chǔ)上,該裝置還包括:釋放模塊301。
釋放模塊301,用于在解析模塊204對(duì)所述節(jié)點(diǎn)樹(shù)上的節(jié)點(diǎn)依次進(jìn)行解析,獲取所述XML文檔的解析結(jié)果之后,將所讀取的所述至少一行數(shù)據(jù)進(jìn)行釋放。
該裝置用于執(zhí)行前述方法實(shí)施例,其技術(shù)效果和實(shí)現(xiàn)原理類似,在此不再贅述。
在本發(fā)明所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。
所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方, 或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用硬件加軟件功能單元的形式實(shí)現(xiàn)。
上述以軟件功能單元的形式實(shí)現(xiàn)的集成的單元,可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。上述軟件功能單元存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)或處理器(英文:processor)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤(pán)、移動(dòng)硬盤(pán)、只讀存儲(chǔ)器(英文:Read-Only Memory,簡(jiǎn)稱:ROM)、隨機(jī)存取存儲(chǔ)器(英文:Random Access Memory,簡(jiǎn)稱:RAM)、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。
最后應(yīng)說(shuō)明的是:以上各實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述各實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍。