欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

對xml報文中的節(jié)點進行劃分及其對其應(yīng)用的方法

文檔序號:6333312閱讀:736來源:國知局
專利名稱:對xml報文中的節(jié)點進行劃分及其對其應(yīng)用的方法
技術(shù)領(lǐng)域
本發(fā)明涉及計算機應(yīng)用領(lǐng)域,特別涉及一種對XML報文中的節(jié)點進行劃分及其對 其應(yīng)用的方法。
背景技術(shù)
XML(Extensible Markup Language)即可擴展標(biāo)記語言,它與 HTML—樣,都是 SGML (Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語言)。XML 是 Internet 環(huán) 境中跨平臺的,依賴于內(nèi)容的技術(shù),是當(dāng)前處理結(jié)構(gòu)化文檔信息的有力工具??蓴U展標(biāo)記語 言XML是一種簡單的數(shù)據(jù)存儲語言,使用一系列簡單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用 方便的方式建立,雖然XML占用的空間比二進制數(shù)據(jù)要占用更多的空間,但XML極其簡單易 于掌握和使用。XML廣泛的應(yīng)用于網(wǎng)絡(luò)及其相關(guān)技術(shù),目前對XML報文進行解析的方法,普遍的為 XML DOMjXML DOM定義了訪問和處理XML報文的標(biāo)準(zhǔn)方法,XML DOM是XML Document Object Model的縮寫,即XML報文對象模型。當(dāng)主機使用XML DOM所提供的方法進行XML報文的 解析時,需要先將XML全部節(jié)點進行掃描,并在主機內(nèi)存中建立完整的節(jié)點樹,通過節(jié)點樹 對XML報文中的符合條件的數(shù)據(jù)進行查找,這種方法占用主機的內(nèi)存資源過多,尤其是當(dāng) 對XML報文的解析在單片機中進行時,如智能卡中對XML報文的解析,智能卡由于體積的限 制,本身的內(nèi)存資源較小,當(dāng)使用XML DOM的方法對XML報文進行解析時,如果XML報文過 大,則智能卡設(shè)備的內(nèi)存負(fù)擔(dān)過大。在對XML報文進行解析時,還可以采用面向?qū)ο缶幊痰姆椒?,使用面向?qū)ο笳Z言 中提供的接口,通過編程實現(xiàn)XML解析器,使用解析器對XML報文進行解析,但是這種方法 不適用于嵌入式環(huán)境,嵌入式環(huán)境不能支持面向?qū)ο蟮腦ML解析方法,但是由于嵌入式的 廣泛應(yīng)用,例如智能密鑰設(shè)備USB Key等,在嵌入式環(huán)境中對XML報文的解析是必不可少 的。綜上所述,現(xiàn)有技術(shù)的的缺點是現(xiàn)有的對XML報文的解析方法占用大量的內(nèi)存 資源或不能適用于嵌入式環(huán)境中對XML報文的解析。

發(fā)明內(nèi)容
鑒于現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種XML報文中節(jié)點的劃分方法,如下步驟Al,獲取當(dāng)前位置和當(dāng)前位置的值;步驟A2,判斷當(dāng)前位置的值是否超過了所述XML報文的總長度或者為負(fù)數(shù),如果 當(dāng)前位置的值超過了所述XML報文的總長度或者為負(fù)數(shù),返回錯誤,否則,執(zhí)行步驟A3 ;步驟A3,判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A5,如果 不是,執(zhí)行步驟A4;步驟A4,將當(dāng)前位置移動一個單位,并將移動一個單位后得到的字符的位置作為 當(dāng)前位置,返回執(zhí)行步驟A2;
步驟A5,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點邊界,并將當(dāng)前位置移動一個單位,將移 動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置;步驟A6,判斷當(dāng)前位置的值是否超過了所述XML報文的總長度或者為負(fù)數(shù),如果 當(dāng)前位置的值超過了所述XML報文的總長度或者為負(fù)數(shù),返回錯誤,否則,執(zhí)行步驟A7 ;步驟A7,判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果 不是,將當(dāng)前位置按與步驟A5中當(dāng)前位置移動方向相同的方向移動一個單位,將移動一個 單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟A6 ;步驟A8,將當(dāng)前位置作為當(dāng)前節(jié)點的另一個節(jié)點邊界,得到當(dāng)前節(jié)點,所述節(jié)點邊 界包括節(jié)點頭和節(jié)點尾。優(yōu)選地,所述當(dāng)前位置的值為當(dāng)前位置的字符相對于所述XML報文起始位置的偏 移。相應(yīng)地,所述當(dāng)前節(jié)點使用一個二元組進行表示,所述二元組包括所述當(dāng)前節(jié)點 的節(jié)點頭和節(jié)點尾,在所述二元組中,使用所述當(dāng)前節(jié)點的節(jié)點頭相對于所述XML報文中 起始位置的偏移表示所述節(jié)點頭,使用所述當(dāng)前節(jié)點的節(jié)點尾相對于所述XML報文中起始 位置的偏移表示所述節(jié)點尾。優(yōu)選地,步驟A4具體的包括將當(dāng)前位置向前移動一個單位,并將所述向前移動一個單位后得到的字符的位置 作為當(dāng)前位置,并將表示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A2 ;或,將當(dāng)前位置向后移動一個單位,并將所述向后移動一個單位后得到的字符的位置 作為當(dāng)前位置,并將表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A2。 優(yōu)選地,步驟A5具體的包括將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭,并將當(dāng)前位置向后移動一個單位,將向后移 動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞增1 ;或,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾,并將當(dāng)前位置向前移動一個單位,將向前移 動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞減1。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭,并將當(dāng)前位置向后移 動一個單位時,步驟A7具體的為判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將 當(dāng)前位置向后移動一個單位,將向后移動一個單位后得到的字符的位置作為當(dāng)前位置,并 令表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A6。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾,并將當(dāng)前位置向前移 動一個單位時,步驟A7具體的為判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將 當(dāng)前位置向前移動一個單位,將向前移動一個單位后得到的字符的位置作為當(dāng)前位置,并 令表示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A6。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭,并將當(dāng)前位置向后移 動一個單位時,步驟A8具體的為
將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾,得到當(dāng)前節(jié)點。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾,并將當(dāng)前位置向前移 動一個單位時,步驟A8具體的為將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭,得到當(dāng)前節(jié)點。優(yōu)選地,所述將當(dāng)前位置移動一個單位為由當(dāng)前字符的位置移動一個字符的距罔。通過上述一種XML報文中節(jié)點的劃分方法,本發(fā)明可以實現(xiàn)一種XML報文中節(jié)點 類型判斷方法,具體的為步驟B 1,判斷當(dāng)前節(jié)點是否為以“ < ”開頭,以“ > ”結(jié)尾,如果是,執(zhí)行步驟B2, 如果不是,執(zhí)行步驟B7 ;步驟B2,判斷當(dāng)前節(jié)點中字符“<”之后的第一個位置對應(yīng)的字符,如果為“? ”,執(zhí) 行步驟B3,如果為“ ! ”,執(zhí)行步驟B4,如果為“/”,執(zhí)行步驟B5,否則,執(zhí)行步驟B6 ;步驟B3,判斷當(dāng)前節(jié)點中字符“ >,,之前的位置所對應(yīng)的字符是否為“ ? ”,如果是 “ ? ”,判斷當(dāng)前節(jié)點中“ <,,之后的下一個位置的“? ”與“ >,,之前第一個位置的“ ?,,是否 重合,如果不重合,則記錄當(dāng)前節(jié)點為XML報文的頭,如果重合,返回錯誤,如果不是“ ? ”,報 文錯誤;步驟B4,記錄當(dāng)前節(jié)點為不需要解析的部分;步驟B5,記錄當(dāng)前節(jié)點為元素尾;步驟B6,判斷當(dāng)前節(jié)點中字符“>”前的一個字符是否為“/”,如果是,則當(dāng)前節(jié)點 為一個完整的元素,否則,當(dāng)前節(jié)點為一個元素的元素頭;步驟B7,判斷當(dāng)前節(jié)點是否以“>”開頭,以“<”結(jié)尾,如果是,則記錄當(dāng)前節(jié)點為 元素中間的值,如果不是,返回錯誤,結(jié)束判斷節(jié)點類型。通過上述一種XML報文中節(jié)點的劃分方法,本發(fā)明可以實現(xiàn)一種XML報文中定位 元素的方法,具體的包括步驟Cl,判斷當(dāng)前節(jié)點的類型,如果是完整的元素,執(zhí)行步驟C2,如果是元素頭, 執(zhí)行步驟C3,如果是元素尾,執(zhí)行步驟C5,如果是元素中間的值,執(zhí)行步驟C7,如果是不需 要解析的部分,執(zhí)行步驟C8,如果是報文頭,返回錯誤;步驟C2,記錄當(dāng)前節(jié)點所屬的元素即為所述步驟Cl中的完整的元素;步驟C3,劃分得到當(dāng)前節(jié)點的下一個節(jié)點,并設(shè)為第一節(jié)點;步驟C4,判斷第一節(jié)點的節(jié)點類型如果是元素尾,判斷第一節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如 果相同,則當(dāng)前節(jié)點所屬的元素為以當(dāng)前節(jié)點尾元素頭、第一節(jié)點尾元素尾組成的元素,如 果不相同,則劃分得到第一節(jié)點的下一個節(jié)點,并設(shè)為第一節(jié)點,返回重新執(zhí)行步驟C4 ;如果是元素頭,判斷第一節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如 果相同,則返回錯誤,結(jié)束對所述XML報文的解析,如果不相同,劃分得到第一節(jié)點的下一 個節(jié)點,并設(shè)為第一節(jié)點,返回重新執(zhí)行步驟C4 ;如果是元素中間的值,劃分得到第一節(jié)點的下一個節(jié)點,并設(shè)為第一節(jié)點,返回重 新執(zhí)行步驟C4 ;步驟C5,劃分得到當(dāng)前節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點;
步驟C6,判斷第二節(jié)點的節(jié)點類型如果是元素頭,判斷第二節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如 果相同,則得到當(dāng)前節(jié)點所屬元素為以第二節(jié)點為元素頭、當(dāng)前節(jié)點為元素尾組成的元素, 如果不相同,劃分得到第二節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點,返回重新執(zhí)行步驟C6;如果是元素尾,判斷第二節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如 果相同,返回錯誤,結(jié)束對所述XML報文的解析,如果不相同,則根據(jù)所述預(yù)先約定的節(jié)點 劃分方法,劃分得到第二節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點,返回重新執(zhí)行步驟C6;如果是元素中間的值,劃分得到第二節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點,返回重 新執(zhí)行步驟C6 ;步驟C7,劃分得到當(dāng)前節(jié)點的上一個節(jié)點,設(shè)為第三節(jié)點,劃分得到當(dāng)前節(jié)點的下 一個節(jié)點,設(shè)為第四節(jié)點,并判斷第三節(jié)點和第四節(jié)點的類型如果第三節(jié)點和第四節(jié)點都是元素頭,則第三節(jié)點和當(dāng)前節(jié)點屬于同一個元素, 根據(jù)第三節(jié)點和當(dāng)前節(jié)點向后劃分得到第五節(jié)點,則得到當(dāng)前節(jié)點所屬的元素為以第三節(jié) 點為元素頭、第五節(jié)點為元素尾的元素;如果第三節(jié)點和第四節(jié)點都是元素尾,則第四節(jié)點和當(dāng)前節(jié)點屬于同一個元素, 根據(jù)第四節(jié)點和當(dāng)前節(jié)點向前劃分得到第六節(jié)點,則得到當(dāng)前節(jié)點所屬的元素為以第六節(jié) 點為元素頭、第四節(jié)點為元素尾的元素;如果第三節(jié)點為元素頭、第四節(jié)點為元素尾,判斷第三節(jié)點中的元素名稱與第四 節(jié)點中的元素名稱是否相同,如果相同,則當(dāng)前節(jié)點所屬的元素為以第三節(jié)點為元素頭、第 四節(jié)點為元素尾組成的元素,如果不相同,返回錯誤;如果第三節(jié)點為元素尾、第四節(jié)點為元素頭,返回錯誤;步驟C8,劃分得到當(dāng)前節(jié)點的下一個節(jié)點,并設(shè)為當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為 需要解析的部分,如果是,返回步驟Cl,如果不是,重復(fù)執(zhí)行本步驟操作,直到當(dāng)前節(jié)點超出 所述XML報文的范圍。優(yōu)選地,所述根據(jù)第三節(jié)點和當(dāng)前節(jié)點向后劃分得到第五節(jié)點,具體的包括步驟C8_a,劃分得到當(dāng)前節(jié)點的下一個節(jié)點,并設(shè)為第五臨時節(jié)點;步驟C8_b,判斷第五臨時節(jié)點是否為元素尾,如果是,執(zhí)行步驟C8-c,如果不 是,繼續(xù)劃分得到第五臨時節(jié)點的下一個節(jié)點,并設(shè)為第五臨時節(jié)點,返回重新執(zhí)行步驟 C8-b ;步驟C8-c,判斷第五臨時節(jié)點中的元素名稱與第三節(jié)點中的元素名稱是否相同, 如果相同,則將第五臨時節(jié)點記錄為第五節(jié)點,如果不相同,劃分得到第五臨時節(jié)點的下一 個節(jié)點,并設(shè)為第五臨時節(jié)點,返回重新執(zhí)行步驟C8-b。優(yōu)選地,所述根據(jù)第四節(jié)點和當(dāng)前節(jié)點向前劃分得到第六節(jié)點,具體的包括步驟C8_a’,劃分得到當(dāng)前節(jié)點的上一個節(jié)點,并設(shè)為第六臨時節(jié)點;步驟C8_b’,判斷第六臨時節(jié)點是否為元素頭,如果是,執(zhí)行步驟C8-c’,如果不 是,繼續(xù)劃分得到第六臨時節(jié)點的上一個節(jié)點,并設(shè)為第六臨時節(jié)點,返回重新執(zhí)行步驟 C8-b,;步驟C8-c’,判斷第六臨時節(jié)點中的元素名稱與第四節(jié)點中的元素名稱是否相同, 如果相同,將第六臨時節(jié)點記錄為第六節(jié)點,如果不相同,則執(zhí)行步驟劃分得到第六臨時節(jié)點的上一個節(jié)點,并設(shè)為第六臨時節(jié)點,返回重新執(zhí)行步驟C8_b’。通過上述一種XML報文中節(jié)點的劃分方法,本發(fā)明可以實現(xiàn)一種XML報文中定位 當(dāng)前元素的第一個子元素的方法,具體的包括步驟D1,從當(dāng)前元素的元素頭的節(jié)點開始,劃分得到當(dāng)前元素的元素頭的節(jié)點的 下一個節(jié)點,并設(shè)為第七節(jié)點;步驟D2,判斷第七節(jié)點的位置是否超出了當(dāng)前元素的元素尾,如果是,返回錯誤, 如果不是,判斷第七節(jié)點的類型如果是元素頭,并且第七節(jié)點包含的元素名稱與當(dāng)前元素的元素名稱不同,則第 七節(jié)點為當(dāng)前元素的第一個子元素的元素頭,執(zhí)行步驟D3 ;如果是元素尾,執(zhí)行步驟D4 ;否則,執(zhí)行步驟D5;步驟D3,由第七節(jié)點定位得到當(dāng)前元素的第一個子元素;步驟D4,判斷第七節(jié)點與當(dāng)前元素的元素尾是否重合,如果是,則當(dāng)前元素沒有子 元素,如果不是,則返回錯誤;步驟D5,劃分得到第七節(jié)點的下一個節(jié)點,并設(shè)為第七節(jié)點,返回重新執(zhí)行步驟 D2。通過上述一種XML報文中節(jié)點的劃分方法,本發(fā)明可以實現(xiàn)一種XML報文中相鄰 元素的定位方法,具體的包括步驟E1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒有根元素,如果不是, 執(zhí)行步驟E2 ;步驟E2,根據(jù)預(yù)先約定的父元素定位方法,查找當(dāng)前元素的父元素,并定位當(dāng)前元 素的父元素的位置;步驟E3,根據(jù)所述預(yù)先約定的節(jié)點劃分方法,劃分得到當(dāng)前元素的元素尾的下一 個節(jié)點,并設(shè)為第八節(jié)點;步驟E4,判斷第八節(jié)點是否超出當(dāng)前元素的父元素的范圍如果是,停止對當(dāng)前元素的相鄰元素的查找;如果不是,判斷第八節(jié)點的節(jié)點類型,如果是元素頭,則第八節(jié)點為當(dāng)前元素的相 鄰元素的元素頭,根據(jù)所述預(yù)先約定的元素定位方法,得到當(dāng)前元素的相鄰元素,否則,根 據(jù)所述預(yù)先約定的節(jié)點劃分方法,劃分得到第八節(jié)點的下一個節(jié)點,設(shè)為第八節(jié)點,返回重 新執(zhí)行步驟E4。優(yōu)選地,所述預(yù)先約定的父元素定位方法,具體的包括步驟E2-1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒有父元素,如果不 是,執(zhí)行步驟E2-2;步驟E2-2,劃分得到當(dāng)前元素的元素頭的上一個節(jié)點,并設(shè)為第九節(jié)點;步驟E2-3,判斷第九節(jié)點的類型,如果是元素頭,執(zhí)行步驟E2-4,否則,執(zhí)行步驟 E2-5 ;步驟E2-4,第九節(jié)點為當(dāng)前元素的父元素的元素頭,根據(jù)所述預(yù)先約定的元素定 位方法,由第九節(jié)點定位得到當(dāng)前元素的父元素;步驟E2-5,劃分得到第九節(jié)點的上一個節(jié)點,并設(shè)為第九節(jié)點,返回步驟E2-3。
通過上述一種一種XML報文中節(jié)點的劃分方法,以及基于上述節(jié)點劃分方法的節(jié) 點類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個子元素的方法、相鄰元素的定位方 法,本發(fā)明可以實現(xiàn)一種XML報文的解析方法,具體的包括步驟F1,獲取XML報文中的根元素,將所述根元素設(shè)為當(dāng)前元素;步驟F2,判斷當(dāng)前元素是否有子元素,如果有,執(zhí)行步驟F3,如果沒有,執(zhí)行步驟 F4 ;步驟F3,查找當(dāng)前元素的第一個子元素,將所述第一個子元素設(shè)為當(dāng)前元素,返回 步驟F2 ;步驟F4,判斷當(dāng)前元素之后是否有相鄰元素,如果有,執(zhí)行步驟F5,如果沒有,執(zhí) 行步驟F6;步驟F5,定位并獲取當(dāng)前元素的相鄰元素,將所述當(dāng)前元素的相鄰元素設(shè)為當(dāng)前 元素,返回步驟F2;步驟F6,將當(dāng)前元素的父元素設(shè)為當(dāng)前元素,并判斷當(dāng)前元素是否為根元素,如果 是,執(zhí)行步驟F7,如果不是,返回步驟F4 ;步驟F7,所述XML報文解析完畢。本發(fā)明實施例提供的技術(shù)方案帶來的有益效果是一種XML報文中節(jié)點的劃分方 法,以及基于上述節(jié)點劃分方法的節(jié)點類型判斷方法、定位元素方法、定位當(dāng)前元素的第一 個子元素的方法、相鄰元素的定位方法、XML報文的解析方法,本發(fā)明提供的解析方法適合 使用C語言實現(xiàn),可以應(yīng)用于嵌入式環(huán)境中,并且不需要建立節(jié)點樹,占用內(nèi)存小。


圖1為本發(fā)明具體實施例中所提供的XML報文的元素結(jié)構(gòu)樹形圖;圖2為本發(fā)明具體實施例一中所提供的一種對XML報文中的節(jié)點進行劃分的方法 流程圖;圖3為本發(fā)明具體實施例二中所提供的一種XML報文中節(jié)點類型的判斷方法流程 圖;圖4為本發(fā)明具體實施例三中所提供的一種XML報文中定位元素的方法流程圖;圖5為本發(fā)明具體實施例四中所提供的一種XML報文中定位當(dāng)前元素的第一個子 元素的方法流程圖;圖6為本發(fā)明具體實施例五中所提供的一種XML報文中相鄰元素的定位方法流程 圖;圖7為本發(fā)明具體實施例六中所提供的一種XML報文的解析方法流程圖。
具體實施例方式下面結(jié)合附圖和具體實施例對本發(fā)明作進一步說明,但不作為對本發(fā)明的限定。以下實施例提供了對XML報文中的節(jié)點進行劃分及其對其應(yīng)用的方法,其中,對 節(jié)點進行劃分的方法的應(yīng)用包括節(jié)點類型判斷、定位元素方法、定位當(dāng)前元素的第一個子 元素、定位相鄰元素、XML報文的解析。為了便于說明,以下提供了如下一段XML報文,實施例1到實施例5均為以此XML報文進行說明< ?xml version = “ 1.0〃 encoding = “ utf-8 “ ? ><SignData><TradeType name =〃 于內(nèi)轉(zhuǎn)賬〃 >innerTransfer</ TradeType><SubType name= 〃工資卡〃 >salary card</SubType><Timestamp>12345</Timestamp>〈Fields〉〈PayerAcNo name =〃 轉(zhuǎn)出賬戶“ >6222030200000384</PayerAcNo>〈PayeeAcNo name =〃 轉(zhuǎn)入賬戶“ >6227881000987</PayeeAcNo>< Amount name="金額‘‘>1000. 5</Amount>〈TranDate name="時間“>2009-12_06</ TranDate><JnlNo>xxxxxxx</JnlNo>〈/Fields〉</SignData>為了便于說明,在本發(fā)明中對報文中的數(shù)據(jù)形式做如下定義將XML報文中以“<”開頭、以“>”結(jié)尾的字符串或以“>”開頭、以“<”結(jié) 尾的字符串定義為一個節(jié)點,例如“<SignData>”為一個節(jié)點,” “> 12345 <”也為一 個節(jié)點,特別地,以< xml開頭的節(jié)點為XML報文的頭,例如節(jié)點“〈? xml version ="1.0〃 encoding = " utf-8" ? >”為本實施例所提供的XML報文的頭;將形如“〈Amount name ="金額‘‘>1000. 5</Amount>”的字符串定為為一個元 素,元素至少由一個節(jié)點組成,在上述元素中,由三個節(jié)點組成,完整的元素應(yīng)包括元素頭、 值、元素尾,在上述元素中,“〈Amount name="金額“ > ”為元素頭,1000. 5為值,“</ Amount〉”為元素尾,在一個元素的元素尾中“</”和“>”之間的字符串為該元素的名稱, 在該元素中,可以將該元素稱為元素Amount,1000. 5為一個文本節(jié)點,因此,上述元素可 以說成是元素Amount擁有一個值為1000. 5的文本節(jié)點,需要注意的是,1000. 5不是元素 Amount的值,在上述元素中,“name="金額“”為元素屬性,并且元素屬性只能存在于 元素頭中;其中,元素可以進行嵌套,一個元素應(yīng)該以“<元素名稱”開頭,“</元素名稱〉”結(jié) 尾,例如在上述XML報文中,元素SignData中嵌套有元素TradeType、SubType、Timestamp、 Fields,兀素 Fields 中嵌套有兀素 PayerAcNo> PayeeAcNo> Amount> TranDate、JnlNo ;XML報文可以解析為元素樹,為了便于了解XML報文的結(jié)構(gòu),使用元素樹表示上述 XML報文,如圖1 ;實施例1 在本實施例中,提供了 一種對XML報文中的節(jié)點進行劃分的方法,根據(jù)此方法,可 以在XML報文的任意位置開始對XML報文進行掃描,完成節(jié)點的劃分過程,參見圖2,具體的如下步驟101,獲取當(dāng)前位置和當(dāng)前位置的值;在本發(fā)明中,進行如下約定,給定一個XML報文,“位置”指的是相對于報文起始處 的偏移量,“向前移動”指的是偏移量減小,“向后移動”指的是偏移量增加,優(yōu)選地,向前移 動使用“-1”表示向前移動一個字符,向后移動使用“+1”表示向后移動一個字符;優(yōu)選地,XML報文的起始位置即第一個字符的位置使用0表示,從起始位置向后移 動一個單位得到XML報文的第二個字符,則第二個字符的位置使用1表示,依此類推,使用 值和偏移可表示當(dāng)前XML報文的所有位置。在本發(fā)明中,設(shè)有當(dāng)前位置,當(dāng)前位置表示XML解析器正在處理的XML報文中的字 符所在的位置,不固定為某一個字符,為了便于說明本實施例中將當(dāng)前字符的位置的值以A 進行表示;一般地,對XML報文的解析由報文的初始位置開始,在本實施例中,以上述XML報 文為例進行說明,以對XML報文的初始位置開始進行節(jié)點劃分和掃描為例進行說明,因此 將上述XML報文的第一個字符作為當(dāng)前位置,此時A的值具體的為0 ;需要說明的是,在本實施例所提供的節(jié)點劃分方法,優(yōu)選地以一個二元組來表示 一個節(jié)點,例如二元組可以為(al,a2),表示當(dāng)前節(jié)點的位置和長度,其中,al為當(dāng)前節(jié)點 的節(jié)點頭的位置的值,用來表示當(dāng)前節(jié)點的節(jié)點頭的位置,a2為當(dāng)前節(jié)點的節(jié)點尾的位置 的值,用來表示當(dāng)前節(jié)點的節(jié)點尾的位置,a2-al+l即是節(jié)點的長度;步驟102,判斷當(dāng)前位置的值是否超過XML報文的總長度或者為負(fù)數(shù),如果當(dāng)前位 置的值超過了其所屬XML報文的總長度或為負(fù)數(shù),返回錯誤,否則,執(zhí)行步驟103 ;步驟103,判斷當(dāng)前位置對應(yīng)的字符是否為“ < ”或“ >”,如果是,執(zhí)行步驟105,如 果不是,執(zhí)行步驟104;步驟104,將當(dāng)前位置移動一個單位,將移動一個單位后得到的字符作為當(dāng)前位 置,執(zhí)行步驟102 ;其中,在本實施例中,移動一個單位具體的為移動一個字符的長度;在本步驟中,將當(dāng)前位置移動移動一個單位可以向前移動,也可以向后移動,因 此,步驟104具體的可以為將當(dāng)前位置向前移動一個單位,將向前移動一個單位后得到的字符作為當(dāng)前位 置,并將表示當(dāng)前位置的值遞減1,執(zhí)行步驟102,或,將當(dāng)前位置向后移動一個單位,將向后移動一個單位后得到的字符作為當(dāng)前位 置,并將表示當(dāng)前位置的值遞增1,執(zhí)行步驟102,步驟105,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點邊界,并將當(dāng)前位置移動一個單位,將 移動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置;在本實施例中,節(jié)點邊界包括節(jié)點頭和節(jié)點尾;因此,當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭時,步驟105具體的為將 當(dāng)前位置記錄為當(dāng)前節(jié)點的節(jié)點頭al,并將當(dāng)前位置向后移動一個單位,即令A(yù) = al+Ι,將 移動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置;例如,在本實施例中,設(shè)當(dāng)前位置A = 0,則當(dāng)前位置的字符為“<”,將當(dāng)前位置A=0作為節(jié)點的節(jié)點頭,令al = 0,并且將當(dāng)前位置向后移動一個單位,使得當(dāng)前位置為A =1 ;當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾時,步驟105具體的為將當(dāng)前 位置記錄為當(dāng)前節(jié)點的節(jié)點尾a2,并將當(dāng)前位置向前移動一個單位,即令A(yù) = a2_l,將向前 移動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置;在本發(fā)明中,當(dāng)前位置、當(dāng)前節(jié)點同當(dāng)前元素一樣,表示XML解析器正在處理的對 象,不固定為某一具體對象,當(dāng)前位置、當(dāng)前節(jié)點所指代的對象由上一步驟指示得到,相應(yīng) 的,用于表示當(dāng)前位置的值A(chǔ),也為相同情況,隨著當(dāng)前位置的改變而改變。步驟106,判斷當(dāng)前位置的值是否超過XML報文的總長度或者為負(fù)數(shù),如果當(dāng)前位 置的值超過了其所屬XML報文的總長度或為負(fù)數(shù),返回錯誤,否則,執(zhí)行步驟107 ;在本實施例中,執(zhí)行到此步驟時,當(dāng)前位置的值為1,不為負(fù)數(shù)且不超過XML報文 的總長度,則執(zhí)行步驟107;步驟107,判斷當(dāng)前位置對應(yīng)的字符是否為“ < ”或“ >”,如果是,執(zhí)行步驟108,如 果不是,將當(dāng)前位置按與步驟105中當(dāng)前位置移動方向相同的方向移動一個單位,將移動 一個單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟106 ;具體地,在本實施例中,當(dāng)步驟105中,將當(dāng)前位置記錄為當(dāng)前節(jié)點的節(jié)點頭al, 并將當(dāng)前位置向后移動一個單位時,步驟107具體的為判斷當(dāng)前位置對應(yīng)的字符是否為“ < ”或“ > ”,如果是,執(zhí)行步驟108,如果不是, 將當(dāng)前位置向后移動一個單位,將向后移動一個單位后得到的字符的位置作為當(dāng)前位置, 并將當(dāng)前位置的值遞增1,返回執(zhí)行步驟106 ;例如在本實施例中,當(dāng)前位置A = 1時,對應(yīng)的字符為“ ? ”,不是“ < ”或“ > ”,因 此需要將當(dāng)前位置向后移動一個單位,即令當(dāng)前位置A = 2,并返回執(zhí)行步驟106 ;當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾時,步驟105具體的為將當(dāng)前 位置記錄為當(dāng)前節(jié)點的節(jié)點尾a2時,步驟107具體的為判斷當(dāng)前位置對應(yīng)的字符是否為“ < ”或“ > ”,如果是,執(zhí)行步驟108,如果不是, 將當(dāng)前位置向前移動一個單位,將向前移動一個單位后得到的字符的位置作為當(dāng)前位置, 并將當(dāng)前位置的值遞減1,返回執(zhí)行步驟106 ;步驟108,將當(dāng)前位置作為當(dāng)前節(jié)點的另一個節(jié)點邊界,得到當(dāng)前節(jié)點。具體地,當(dāng)步驟105中,將當(dāng)前位置記錄為當(dāng)前節(jié)點的節(jié)點頭al,并將當(dāng)前位置向 后移動一個單位時,步驟108具體的為將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾a2,得到當(dāng)前節(jié)點(al,a2)。當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾時,步驟105具體的為將當(dāng)前 位置記錄為當(dāng)前節(jié)點的節(jié)點尾a2時,步驟108具體的為將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭al,得到當(dāng)前節(jié)點(al,a2)。其中,由于步驟101中以當(dāng)前位置A = 0開始對節(jié)點進行劃分為例進行說明,在步 驟107中,由于當(dāng)前位置不是字符“<”或“>”,因此將當(dāng)前位置向后移動一個單位,再返回 執(zhí)行步驟106,只要當(dāng)前位置的字符不為“<”或“>”,則將當(dāng)前位置以一個字符為單位一直 后移,并且每次后移后,判斷當(dāng)前位置是否為“ < ”或“ > ”,在本實施例中,當(dāng)當(dāng)前位置A = 39時,得到字符“>”,判斷得到為當(dāng)前節(jié)點的節(jié)點尾,因此上述XML報文的第一個節(jié)點使用二元組表示為(0,39),節(jié)點長度為40,當(dāng)前節(jié)點具體的為"< ? xml version = “ 1.0〃 encoding = “ utf-8“ ? >,,通過上述方法,可以由XML報文的任意位置開始將XML報文進行節(jié)點的劃分,本實 施例中所提供的節(jié)點劃分方法,使用數(shù)組表示一個節(jié)點,數(shù)組中為節(jié)點的節(jié)點頭和節(jié)點尾 的偏移,在使用上述節(jié)點劃分方法進行XML報文的解析時,不需要將全部節(jié)點的字符讀入 內(nèi)存,可以節(jié)省內(nèi)存空間,尤其適用于嵌入式環(huán)境中或在內(nèi)存較小的智能密鑰設(shè)備中應(yīng)用。實施例2基于實施例1所提供的一種節(jié)點劃分方法,本實施例提供了一種XML報文中節(jié)點 類型的判斷方法,參加圖3,具體的如下步驟201,判斷當(dāng)前節(jié)點是否為以“<”開頭,以“>”結(jié)尾,如果是,則執(zhí)行步驟 202,如果不是,執(zhí)行步驟207 ;在本步驟中,劃分得到下一個節(jié)點的方法與實施例1中相同,這里不再贅述;步驟202,判斷當(dāng)前節(jié)點中字符“ <,,之后的第一個位置對應(yīng)的字符,如果為“ ? ”, 執(zhí)行步驟203,如果為“ ! ”,執(zhí)行步驟204,如果為“/”,執(zhí)行步驟205,否則,執(zhí)行步驟206 ;步驟203,判斷當(dāng)前節(jié)點中字符“>”之前的位置所對應(yīng)的字符是否為“ ?”;如果是,判斷“<”之后的下一個位置的“? ”與“>”之前第一個位置的“? ”是否 重合,如果不重合,則記錄所述節(jié)點為XML報文的頭,如果重合,報錯;例如在本實施例中,節(jié)點頭為〈? xml version = 〃 1. 0 “ encoding ="utf-8" >,即為以‘‘<”開頭,以“>”結(jié)尾的節(jié)點,并且當(dāng)前節(jié)點中字符“<”之后的 第一個“? ”與由字符“>”向前讀取出現(xiàn)的第一個“?”的位置不重合;如果不是,則報錯,當(dāng)前報文有誤;步驟204,記錄當(dāng)前節(jié)點為不需要解析的部分;需要說明的是,在本實施例中,以“< ! 一”開頭的節(jié)點為XML報文注釋,以“< ! D0CTYPE"開頭的節(jié)點為報文類型定義,以“< ! [CDATA”開頭的節(jié)點為無需解析的文本;步驟205,記錄當(dāng)前節(jié)點為元素尾;其中,在XML報文中,以“< /”開頭的節(jié)點為元素的元素尾;步驟206,判斷當(dāng)前節(jié)點中字符“>”前的一個字符是否為“/”,如果是,則記錄當(dāng) 前節(jié)點為一個完整的元素,否則,記錄當(dāng)前節(jié)點為一個元素的元素頭。其中,在XML報文中,元素的名稱包含在元素頭和元素尾的節(jié)點中,在元素尾的 節(jié)點中,元素的名稱是“</”和“>”之間的字符串,例如在上述XML報文中,節(jié)點“</ Timestamp)"為元素尾,"Timestamp"為元素名稱;在元素頭節(jié)點中,元素的名稱是‘‘ < ”到 第一個空格之間的字符串,如果沒有空格,就是“ <,,和“ > ”之間的字符串;步驟207,判斷當(dāng)前節(jié)點是否以“ > ”開頭,以“ < ”結(jié)尾,如果是,則記錄當(dāng)前節(jié)點 為元素中間的值,如果不是,返回錯誤,停止對節(jié)點類型的判斷。其中,在XML報文中,一個節(jié)點應(yīng)以“〈”開頭,以“〉”結(jié)尾,或以“〉”開頭,以“〈”結(jié)尾。本實施例提供了一種基于實施例1所提供的節(jié)點劃分方法的節(jié)點類型判斷方法, 根據(jù)所述節(jié)點類型判斷方法可以對劃分得到的任何節(jié)點的類型進行判斷,并記錄節(jié)點類型。
實施例3基于實施例1所提供的一種節(jié)點劃分方法,本實施例提供了一種XML報文中定 位元素的方法,所述定位元素的方法可以由任意節(jié)點定位其所屬的元素,參加圖4,具體的 為在本實施例中,為了便于說明,設(shè)一個任意節(jié)點為當(dāng)前節(jié)點Ni,并且設(shè)節(jié)點m所 屬的元素為M,元素M使用一個二元組表示,二元組中分別為元素M的元素頭和元素尾;步驟301,判斷當(dāng)前節(jié)點的類型,如果是完整元素,執(zhí)行步驟302,如果是元素頭, 執(zhí)行步驟303,如果是元素尾,執(zhí)行步驟305,如果是元素中間的值,執(zhí)行步驟307,如果是不 需要解析的部分,執(zhí)行步驟308,如果是報文頭,返回錯誤;其中,判斷節(jié)點類型的方法為實施例2所提供的方法,這里不再贅述;并且,在本實施例中,元素中間的值,指的是一個元素中,元素頭和元素尾中間的 值,例如在元素“<Timestamp>12345</Timestamp>”中,12345即為元素之間的值;步驟302,記錄當(dāng)前節(jié)點附所屬元素為M(Ni,Ni);步驟303,根據(jù)實施例1所提供的節(jié)點劃分方法,對XML報文中當(dāng)前節(jié)點m后的字 符劃分得到下一個節(jié)點,將所述下一個節(jié)點定義為節(jié)點N2 ;步驟304,根據(jù)實施例2所提供的節(jié)點類型判斷方法,判斷節(jié)點N2的類型如果是元素尾,則判斷節(jié)點N2中的元素名稱與節(jié)點m中的元素名稱是否相同,如 果相同,則得到當(dāng)前所屬元素為(Ni,N2),如果不相同,根據(jù)實施例1所提供的節(jié)點劃分方 法,繼續(xù)對XML報文中節(jié)點N2后的下一個節(jié)點進行劃分,并將所述節(jié)點N2后的下一個節(jié)點 設(shè)為新的節(jié)點N2,返回步驟304,繼續(xù)判斷節(jié)點N2的類型;如果是元素頭,則判斷節(jié)點N2中的元素名稱與節(jié)點W中的元素名稱是否相同,如 果相同,返回錯誤,如果不相同,根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)對XML報文中節(jié) 點N2后的下一個節(jié)點進行劃分,并將所述節(jié)點N2后的下一個節(jié)點設(shè)為新的節(jié)點N2,返回步 驟304,繼續(xù)判斷節(jié)點N2的類型;如果是元素中間的值,根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)對XML報文中節(jié) 點N2后的下一個節(jié)點進行劃分,并將所述節(jié)點N2后的下一個節(jié)點設(shè)為新的節(jié)點N2,返回步 驟304,繼續(xù)判斷節(jié)點N2的類型;步驟305,根據(jù)實施例1所提供的節(jié)點劃分方法,對XML報文中當(dāng)前節(jié)點m前的字 符劃分得到上一個節(jié)點,將所述上一個節(jié)點定義為節(jié)點N3 ;步驟306,根據(jù)實施例2所提供的節(jié)點類型判斷方法,判斷節(jié)點N3的類型如果是元素頭,判斷節(jié)點N3中的元素名稱與節(jié)點m中的元素名稱是否相同,如果 相同,則得到當(dāng)前所屬元素為(N3,m),如果不相同,根據(jù)實施例1所提供的節(jié)點劃分方法, 繼續(xù)對XML報文中節(jié)點N3的前一個節(jié)點進行劃分,并將所述節(jié)點N3的前一個節(jié)點設(shè)為新 的節(jié)點N3,返回步驟306,繼續(xù)判斷節(jié)點N3的類型;如果是元素尾,判斷節(jié)點N3中的元素名稱與節(jié)點m中的元素名稱是否相同,如果 相同,返回錯誤,如果不相同,根據(jù)預(yù)先約定的節(jié)點劃分方法,繼續(xù)對XML報文中節(jié)點N3的 前一個節(jié)點進行劃分,并將所述節(jié)點N3的前一個節(jié)點設(shè)為新的節(jié)點N3,返回步驟306,繼續(xù) 判斷節(jié)點N3的類型;如果是元素中間的值,根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)對XML報文中節(jié)點N3的前一個節(jié)點進行劃分,并將所述節(jié)點N3的前一個節(jié)點設(shè)為新的節(jié)點N3,返回步驟 306,繼續(xù)判斷節(jié)點N3的類型;步驟307,根據(jù)實施例1所提供的節(jié)點劃分方法,對XML報文中節(jié)點m的前一個節(jié) 點N4和后一個節(jié)點N5進行劃分,并判斷節(jié)點N4和N5的類型如果節(jié)點N4和N5都是元素頭,則節(jié)點N4和m同屬一個元素,按照方法一找到節(jié) 點N4和m所屬元素的元素尾N6,得到當(dāng)前節(jié)點所屬的元素(N4,N6);如果節(jié)點N4和N5都是元素尾,則節(jié)點N5和m同屬一個元素,按照方法二找到節(jié) 點N5和m所屬元素的元素頭N7,得到當(dāng)前節(jié)點所屬的元素為(N7,N5);如果節(jié)點N4為元素頭,節(jié)點N5為元素尾,則繼續(xù)判斷節(jié)點N4中所包含的元素名 稱與節(jié)點N5中所包含的節(jié)點名稱是否相同,如果相同,得到當(dāng)前節(jié)點所屬的元素為(N4, N5),如果不相同,返回錯誤;如果節(jié)點N5為元素頭,節(jié)點N4為元素尾,返回錯誤;本步驟中,所述方法一和方法二具體的為方法一a,根據(jù)實施例1所提供的節(jié)點劃分方法,劃分得到節(jié)點N5的下一個節(jié)點,并設(shè)為 臨時節(jié)點N6 ;b,根據(jù)實施例2所提供的節(jié)點類型判斷方法,判斷臨時節(jié)點N6是否為元素尾,如 果是,執(zhí)行步驟c,如果不是,根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)劃分得到臨時節(jié)點 N6的下一個節(jié)點,并設(shè)為臨時節(jié)點N6,返回重新執(zhí)行步驟b ;c,判斷臨時節(jié)點N6中的元素名稱與節(jié)點N4中的元素名稱是否相同,如果相同,則 將臨時節(jié)點N6置為節(jié)點N6,如果不相同,則根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)劃分 得到臨時節(jié)點N6的下一個節(jié)點,并設(shè)為臨時節(jié)點N6,返回重新執(zhí)行步驟b ;方法二a’,根據(jù)實施例1所提供的節(jié)點劃分方法,劃分得到節(jié)點N4的上一個節(jié)點,并設(shè)為 臨時節(jié)點N7 ;b’,根據(jù)實施例2所提供的節(jié)點類型判斷方法,判斷臨時節(jié)點N7是否為元素頭,如 果是,執(zhí)行步驟C’,如果不是,根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)劃分得到臨時節(jié) 點N7的上一個節(jié)點,并設(shè)為臨時節(jié)點N7,返回重新執(zhí)行步驟b’ ;c’,判斷臨時節(jié)點N7中的元素名稱與節(jié)點N5中的元素名稱是否相同,如果相同, 則將臨時節(jié)點N7置為節(jié)點N7,如果不相同,則根據(jù)實施例1所提供的節(jié)點劃分方法,繼續(xù)劃 分得到臨時節(jié)點N7的上一個節(jié)點,并設(shè)為臨時節(jié)點N7,返回重新執(zhí)行步驟b’ ;步驟308,對XML報文中節(jié)點m的下一個節(jié)點進行劃分并設(shè)為新的節(jié)點Ni,判斷 節(jié)點W是否為需要解析的部分,如果是,返回步驟301,如果不是需要解析的部分,重新執(zhí) 行本步驟操作,繼續(xù)劃分得到下一個節(jié)點,并判斷所述下一個節(jié)點是否為需要解析的部分, 直到節(jié)點位置超出XML報文的總長;在本實施例中,步驟308還可以按照如下方式實現(xiàn)步驟308’,對XML報文中節(jié)點m的前一個節(jié)點進行劃分并設(shè)為新的節(jié)點Ni,判斷 節(jié)點W是否為需要解析的部分,如果是,返回步驟301,如果不是需要解析的部分,重新執(zhí) 行本步驟操作,繼續(xù)劃分得到前一個節(jié)點,并判斷所述前一個節(jié)點是否為需要解析的部分,直到表示節(jié)點位置的值為負(fù)數(shù);上述步驟301到步驟308描述的為由任意節(jié)點作為當(dāng)前節(jié)點,定位其所屬元素的 方法,由本實施例所提供的方法,還可以定位根元素1)將XML報文中的第一個節(jié)點設(shè)為節(jié)點Si,根據(jù)實施例2所提供的節(jié)點判斷方 法,判斷Sl是否為根元素的元素頭,如果是,執(zhí)行步驟2),如果不是,劃分得到節(jié)點Sl的下 一個節(jié)點并設(shè)為節(jié)點Si,繼續(xù)判斷節(jié)點Sl是否為根元素的元素頭;2)根據(jù)實施例1提供的節(jié)點劃分方法,劃分得到節(jié)點Sl的下一個節(jié)點,設(shè)為節(jié)點 S2,判斷節(jié)點S2的名稱與根元素的元素名稱是否相同,如果相同,則根元素為(Si,S2),如 果不相同,劃分得到節(jié)點S2的下一個節(jié)點并設(shè)為節(jié)點S2,繼續(xù)判斷節(jié)點S2的名稱是否與根 元素的元素名稱相同,直到節(jié)點位置超出XML報文的總長。實施例4基于實施例1所提供的一種節(jié)點劃分方法,本實施例提供了一種XML報文中定位 當(dāng)前元素的第一個子元素的方法,參見圖5,具體的如下在本實施例中,為了便于說明,設(shè)當(dāng)前元素為M= (A1,A2),其中,M表示當(dāng)前元素, 節(jié)點Al為當(dāng)前元素的元素頭,節(jié)點A2為當(dāng)前元素的元素尾,并且Al = (all, al2), A2 = (a21, a22),all為表示節(jié)點Al的節(jié)點頭位置的值,al2為表示節(jié)點Al的節(jié)點尾位置的值, a21為表示節(jié)點A2的節(jié)點頭的位置的值,a22為表示節(jié)點A2的節(jié)點尾的位置的值;步驟401,從當(dāng)前元素的元素頭的節(jié)點尾開始,劃分得到當(dāng)前元素的元素頭的節(jié)點 的下一個節(jié)點,設(shè)為A3;步驟402,判斷節(jié)點A3的位置是否超出了當(dāng)前元素的元素尾,如果是,返回錯誤, 如果不是,執(zhí)行步驟403;步驟403,判斷節(jié)點A3的類型如果是元素頭且名稱與當(dāng)前元素M的名稱不同,執(zhí)行步驟404 ;;如果是元素尾,執(zhí)行步驟406 ;否則,執(zhí)行步驟407;步驟404,記錄A3為當(dāng)前元素的第一個子元素的元素頭;步驟405,根據(jù)實施例2中所提供的元素定位方法,由節(jié)點A3定位當(dāng)前元素的第一 個子元素;在本步驟中,由當(dāng)前元素的第一個子元素的元素頭進行定位,定位方法與實施例2 中由任意節(jié)點定位其所屬元素的方法相同,這里不再贅述,需要說明的是,在定位當(dāng)前元素 M的第一個子元素,即節(jié)點A3所屬元素的過程中,由節(jié)點A3向后劃分節(jié)點時,不能超過位置 al2,如果超過位置al2,則報錯;步驟406,判斷所述當(dāng)前元素的下一個節(jié)點與當(dāng)前元素的元素尾是否重合,即節(jié)點 A3與A2是否重合,如果是,當(dāng)前元素沒有子元素,如果不是,返回報文錯誤;步驟407,繼續(xù)劃分得到節(jié)點A3的下一個節(jié)點,并將得到的節(jié)點A3的下一個節(jié)點 設(shè)為新的節(jié)點A3,返回步驟402 ;本實施例提供了一種定位當(dāng)前節(jié)點的第一個子元素的方法,在XML報文的解析過 程中,可以定位任一個元素的第一個子元素。實施例5
基于實施例1所提供的一種節(jié)點劃分方法,本實施例提供了一種XML報文中相鄰 元素的定位方法,參見圖6,具體的如下在本實施例中,所述相鄰元素的定位方法可以由任意元素定位其相鄰元素,為了 便于說明,將當(dāng)前元素設(shè)為A= (A4,A5),其中A為當(dāng)前元素,A4為當(dāng)前元素A的元素頭, A5為當(dāng)前元素的元素尾,并且A4 = (a41,a42),A5 = (a51,a52),a41為表示節(jié)點A4的節(jié) 點頭位置的值,a42為表示節(jié)點A4的節(jié)點尾位置的值,a51為表示節(jié)點A5的節(jié)點頭的位置 的值,a52為表示節(jié)點A5的節(jié)點尾的位置的值;步驟501,判斷當(dāng)前元素A是否為根元素,如果是,當(dāng)前元素沒有相鄰元素,如果不 是,執(zhí)行步驟502 ;步驟502,查找當(dāng)前元素A的父元素,并根據(jù)預(yù)先約定的父元素的定位方法,定位 當(dāng)前元素的父元素的位置;具體的,在本發(fā)明中,預(yù)先約定的父元素的定位方法可以對任意元素查找當(dāng)前元 素的父元素,具體的方法為同上,設(shè)當(dāng)前元素為A = (A4,A5),A4 = (a41,a42),A5 = (a51,a52);502-1,判斷當(dāng)前元素A是否為根元素,如果是,則當(dāng)前元素沒有父元素,如果不 是,執(zhí)行步驟502-2 ;在本實施例中,判斷根元素的方法具體的可以為在對XML進行解析時,由報文起 始點開始,查找第一個節(jié)點,判斷第一個節(jié)點的類型,如果是報文頭,則繼續(xù)向后查找節(jié)點 并判斷節(jié)點類型,找到出現(xiàn)的第一個元素頭,則該元素頭為根元素的元素頭,根據(jù)該元素頭 定位根元素,并記錄,以此判斷當(dāng)前元素是否為根元素;502-2,根據(jù)預(yù)先約定的節(jié)點劃分方法,查找并劃分當(dāng)前元素A的元素頭的上一個 節(jié)點,并設(shè)為A6;502-3,根據(jù)預(yù)先約定的節(jié)點類型判斷方法,判斷節(jié)點A6的類型,如果為元素頭, 執(zhí)行步驟502-4,如果不是元素頭,執(zhí)行步驟502-5 ;502-4,節(jié)點A6為當(dāng)前元素A的父元素的元素頭,根據(jù)預(yù)先約定的元素定位方法, 由節(jié)點A6定位得到當(dāng)前元素A的父元素P= (A6,A7),并且A6 = (a61,a62),A7 = (a71, a72),a61為元素頭A6的節(jié)點頭,a62為元素頭A6的節(jié)點尾,a71為元素尾A7的節(jié)點頭, a72為元素尾A7的節(jié)點尾;502-5,根據(jù)預(yù)先約定的節(jié)點劃分方法,查找并劃分節(jié)點A6的上一個節(jié)點,并將所 述節(jié)點A6的上一個節(jié)點設(shè)為新的節(jié)點A6,返回步驟502-3。步驟503,根據(jù)所述預(yù)先約定的節(jié)點劃分方法,從當(dāng)前元素A的元素尾即a52向后 劃分得到下一個節(jié)點,并設(shè)為節(jié)點A8,步驟504,判斷節(jié)點A8是否超出當(dāng)前元素A的父元素的范圍(即判斷A8是否超出 了當(dāng)前元素A的父元素P的元素尾a71)如果是,執(zhí)行步驟505;如果不是,執(zhí)行步驟506 ;步驟505,停止對當(dāng)前元素的相鄰元素的查找;步驟506,判斷節(jié)點A8的類型是否為元素頭,如果是元素頭,則A8為當(dāng)前元素A的 相鄰元素的元素頭,由節(jié)點A8定位當(dāng)前元素A的相鄰元素,否則,劃分得到節(jié)點A8的下一個節(jié)點,并設(shè)為新的節(jié)點A8,返回步驟504。在本實施例中,步驟503和504,采取XML報文從上到下的,從左到右的解析方法, 還可以采取由當(dāng)前節(jié)點同時向兩邊的查找相鄰元素的方法,此時,步驟503至506可以替換 為從當(dāng)前元素A的元素頭即a41向前逐個劃分節(jié)點,并判斷所述從當(dāng)前元素的元素 頭向前劃分的節(jié)點類型,如果是元素尾,則為相鄰元素的元素尾,根據(jù)元素尾定位相鄰元 素,否則,繼續(xù)向前進行節(jié)點的劃分,直到劃分到當(dāng)前元素A的父元素P的元素頭即a62之 后;并且,從當(dāng)前元素A的元素尾即a52開始向后逐個劃分節(jié)點,并判斷所述從當(dāng)前元素A 的元素頭向后劃分的節(jié)點類型,如果是元素頭,則為當(dāng)前元素的相鄰元素的元素頭,根據(jù)所 述元素頭定位相鄰元素,否則,繼續(xù)向后進行節(jié)點的劃分,直到劃分到當(dāng)前元素A的父元素 P的元素尾即a71之前。實施例6基于實施例1-5所提供的一種對XML報文中的節(jié)點進行劃分的方法及基于上述節(jié) 點劃分方法的節(jié)點類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個子元素的方法、相 鄰元素的定位方法,本實施例提供了一種XML報文的解析方法,具體的如下步驟601,獲取XML報文的根元素,將所述根元素設(shè)為當(dāng)前元素;其中,獲取XML報文根元素的方法與實施例3中所述相同,這里不再贅述;步驟602,判斷當(dāng)前元素是否有子元素,如果有,執(zhí)行步驟603,如果沒有,執(zhí)行步 驟 605 ;步驟603,查找當(dāng)前元素的第一個子元素;在本步驟中,查找當(dāng)前元素的第一個子元素使用實施例4所提供的定位當(dāng)前元素 的第一個子元素的方法,這里不再贅述;步驟604,將步驟603中獲得的第一個子元素置為當(dāng)前元素,并返回步驟602 ;步驟605,判斷當(dāng)前元素之后是否有相鄰元素,如果有,執(zhí)行步驟606,如果沒有, 執(zhí)行步驟608 ;步驟606,定位并獲取當(dāng)前元素的相鄰元素;在本步驟中,定位并獲取當(dāng)前元素的相鄰元素使用實施例5所提供的相鄰元素的 定位方法,這里不再贅述;步驟607,將上述相鄰元素置為當(dāng)前元素,返回步驟602 ;步驟608,將當(dāng)前元素的父元素作為當(dāng)前元素,并判斷當(dāng)前元素是否為根元素,如 果是,執(zhí)行步驟609,如果不是,并返回步驟605 ;在本步驟中,查找當(dāng)前元素的父元素的方法與實施例5中查找當(dāng)前元素的父元素 的方法相同,這里不再贅述;步驟609,XML報文解析完成。在本實施例中,在對元素進行定位的過程中,還包括對當(dāng)前元素的名稱的判斷,如 果解析器發(fā)現(xiàn)XML報文中所需的元素已經(jīng)完成解析并獲得得到了相應(yīng)元素的數(shù)據(jù),則停止 XML報文的解析,以節(jié)省內(nèi)存。本實施例所提供的一種XML報文的解析方法,無需在內(nèi)存中建立完整的節(jié)點樹, 內(nèi)存使用小,適合內(nèi)存小的裝置進行XML報文的解析,并且本實施例所提供的方法,適合C語言進行實現(xiàn),因此可以支持嵌入式環(huán)境的應(yīng)用。在實施例1-6中,元素六、六1、六2、六3、六4、六5、六6、六7、六8、節(jié)點N、N1、N2、N3、N4、N5、 N6、N7、N8、N9以及各臨時節(jié)點,都同當(dāng)前元素的表示方法,為不固定的指定為XML報文中某 個對象,而且根據(jù)XML上一步驟或本步驟中的指示而指代的對象,這在本領(lǐng)域技術(shù)人員中, 應(yīng)該是可以理解的。以上實施例分別一種對XML報文中的節(jié)點進行劃分的方法及基于上述節(jié)點劃分 方法的節(jié)點類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個子元素的方法、相鄰元素 的定位方法、XML報文的解析方法進行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原 理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思 想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式
及應(yīng)用范圍上 均會有改變之處,綜上,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。以上僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則 之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
一種XML報文中的節(jié)點劃分方法,其特征在于,所述方法包括步驟A1,獲取當(dāng)前位置和當(dāng)前位置的值;步驟A2,判斷當(dāng)前位置的值是否超過了所述XML報文的總長度或者為負(fù)數(shù),如果當(dāng)前位置的值超過了所述XML報文的總長度或者為負(fù)數(shù),返回錯誤,否則,執(zhí)行步驟A3;步驟A3,判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A5,如果不是,執(zhí)行步驟A4;步驟A4,將當(dāng)前位置移動一個單位,并將移動一個單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟A2;步驟A5,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點邊界,并將當(dāng)前位置移動一個單位,將移動一個單位后得到的字符的位置設(shè)置為當(dāng)前位置;步驟A6,判斷當(dāng)前位置的值是否超過了所述XML報文的總長度或者為負(fù)數(shù),如果當(dāng)前位置的值超過了所述XML報文的總長度或者為負(fù)數(shù),返回錯誤,否則,執(zhí)行步驟A7;步驟A7,判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將當(dāng)前位置按與步驟A5中當(dāng)前位置移動方向相同的方向移動一個單位,將移動一個單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟A6;步驟A8,將當(dāng)前位置作為當(dāng)前節(jié)點的另一個節(jié)點邊界,得到當(dāng)前節(jié)點,所述節(jié)點邊界包括節(jié)點頭和節(jié)點尾。
2.如權(quán)利要求1所述的方法,其特征在于,所述當(dāng)前位置的值為當(dāng)前位置的字符相對 于所述XML報文起始位置的偏移。
3.如權(quán)利要求2所述的方法,其特征在于,所述當(dāng)前節(jié)點使用一個二元組進行表示,所 述二元組包括所述當(dāng)前節(jié)點的節(jié)點頭和節(jié)點尾,在所述二元組中,使用所述當(dāng)前節(jié)點的節(jié) 點頭相對于所述XML報文中起始位置的偏移表示所述節(jié)點頭,使用所述當(dāng)前節(jié)點的節(jié)點尾 相對于所述XML報文中起始位置的偏移表示所述節(jié)點尾。
4.如權(quán)利要求1所述的方法,其特征在于,步驟A4具體的包括將當(dāng)前位置向前移動一個單位,并將所述向前移動一個單位后得到的字符的位置作為 當(dāng)前位置,并將表示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A2 ; 或,將當(dāng)前位置向后移動一個單位,并將所述向后移動一個單位后得到的字符的位置作為 當(dāng)前位置,并將表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A2。
5.如權(quán)利要求1所述的方法,其特征在于,步驟A5具體的包括將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭,并將當(dāng)前位置向后移動一個單位,將向后移動一 個單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞增1 ; 或,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾,并將當(dāng)前位置向前移動一個單位,將向前移動一 個單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞減1。
6.如權(quán)利要求5所述的方法,其特征在于,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié) 點頭,并將當(dāng)前位置向后移動一個單位時,步驟A7具體的為判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將當(dāng)前 位置向后移動一個單位,將向后移動一個單位后得到的字符的位置作為當(dāng)前位置,并令表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A6。
7.如權(quán)利要求5所述的方法,其特征在于,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié) 點尾,并將當(dāng)前位置向前移動一個單位時,步驟A7具體的為判斷當(dāng)前位置對應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將當(dāng)前 位置向前移動一個單位,將向前移動一個單位后得到的字符的位置作為當(dāng)前位置,并令表 示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A6。
8.如權(quán)利要求6所述的方法,其特征在于,步驟A8具體的為 將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點尾,得到當(dāng)前節(jié)點。
9.如權(quán)利要求7所述的方法,其特征在于,步驟A8具體的為 將當(dāng)前位置作為當(dāng)前節(jié)點的節(jié)點頭,得到當(dāng)前節(jié)點。
10.如權(quán)利要求1所述的方法,其特征在于,所述將當(dāng)前位置移動一個單位為由當(dāng)前字 符的位置移動一個字符的距離。
11.基于權(quán)利要求1所述的一種XML報文中的節(jié)點劃分方法,一種XML報文中節(jié)點類型 判斷方法包括步驟Bi,判斷當(dāng)前節(jié)點是否為以“<”開頭,以“>”結(jié)尾,如果是,執(zhí)行步驟B2,如果不 是,執(zhí)行步驟B7;步驟B2,判斷當(dāng)前節(jié)點中字符“<”之后的第一個位置對應(yīng)的字符,如果為“ ?”,執(zhí)行步 驟B3,如果為“ ! ”,執(zhí)行步驟B4,如果為“/,,,執(zhí)行步驟B5,否則,執(zhí)行步驟B6 ;步驟B3,判斷當(dāng)前節(jié)點中字符“>”之前的位置所對應(yīng)的字符是否為“? ”,如果是“ ?”, 判斷當(dāng)前節(jié)點中“<”之后的下一個位置的“? ”與“>”之前第一個位置的“? ”是否重合, 如果不重合,則記錄當(dāng)前節(jié)點為XML報文的頭,如果重合,返回錯誤,如果不是“ ? ”,報文錯 誤;步驟B4,記錄當(dāng)前節(jié)點為不需要解析的部分; 步驟B5,記錄當(dāng)前節(jié)點為元素尾;步驟B6,判斷當(dāng)前節(jié)點中字符“>”前的一個字符是否為“/”,如果是,則當(dāng)前節(jié)點為一 個完整的元素,否則,當(dāng)前節(jié)點為一個元素的元素頭;步驟B7,判斷當(dāng)前節(jié)點是否以“>”開頭,以“<”結(jié)尾,如果是,則記錄當(dāng)前節(jié)點為元素 中間的值,如果不是,返回錯誤,結(jié)束判斷節(jié)點類型。
12.基于權(quán)利要求1所述的一種XML報文中的節(jié)點劃分方法,一種XML報文中定位元素 的方法包括步驟Cl,判斷當(dāng)前節(jié)點的類型,如果是完整的元素,執(zhí)行步驟C2,如果是元素頭,執(zhí)行 步驟C3,如果是元素尾,執(zhí)行步驟C5,如果是元素中間的值,執(zhí)行步驟C7,如果是不需要解 析的部分,執(zhí)行步驟C8,如果是報文頭,返回錯誤;步驟C2,記錄當(dāng)前節(jié)點所屬的元素即為所述步驟Cl中的完整的元素; 步驟C3,劃分得到當(dāng)前節(jié)點的下一個節(jié)點,并設(shè)為第一節(jié)點; 步驟C4,判斷第一節(jié)點的節(jié)點類型如果是元素尾,判斷第一節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如果相 同,則當(dāng)前節(jié)點所屬的元素為以當(dāng)前節(jié)點尾元素頭、第一節(jié)點尾元素尾組成的元素,如果不 相同,則劃分得到第一節(jié)點的下一個節(jié)點,并設(shè)為第一節(jié)點,返回重新執(zhí)行步驟C4;如果是元素頭,判斷第一節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如果相 同,則返回錯誤,結(jié)束對所述XML報文的解析,如果不相同,劃分得到第一節(jié)點的下一個節(jié) 點,并設(shè)為第一節(jié)點,返回重新執(zhí)行步驟C4 ;如果是元素中間的值,劃分得到第一節(jié)點的下一個節(jié)點,并設(shè)為第一節(jié)點,返回重新執(zhí) 行步驟C4 ;步驟C5,劃分得到當(dāng)前節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點; 步驟C6,判斷第二節(jié)點的節(jié)點類型如果是元素頭,判斷第二節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如果相 同,則得到當(dāng)前節(jié)點所屬元素為以第二節(jié)點為元素頭、當(dāng)前節(jié)點為元素尾組成的元素,如果 不相同,劃分得到第二節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點,返回重新執(zhí)行步驟C6;如果是元素尾,判斷第二節(jié)點中的元素名稱與當(dāng)前節(jié)點的元素名稱是否相同,如果相 同,返回錯誤,結(jié)束對所述XML報文的解析,如果不相同,則根據(jù)所述預(yù)先約定的節(jié)點劃分 方法,劃分得到第二節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點,返回重新執(zhí)行步驟C6;如果是元素中間的值,劃分得到第二節(jié)點的上一個節(jié)點,并設(shè)為第二節(jié)點,返回重新執(zhí) 行步驟C6 ;步驟C7,劃分得到當(dāng)前節(jié)點的上一個節(jié)點,設(shè)為第三節(jié)點,劃分得到當(dāng)前節(jié)點的下一個 節(jié)點,設(shè)為第四節(jié)點,并判斷第三節(jié)點和第四節(jié)點的類型如果第三節(jié)點和第四節(jié)點都是元素頭,則第三節(jié)點和當(dāng)前節(jié)點屬于同一個元素,根據(jù) 第三節(jié)點和當(dāng)前節(jié)點向后劃分得到第五節(jié)點,則得到當(dāng)前節(jié)點所屬的元素為以第三節(jié)點為 元素頭、第五節(jié)點為元素尾的元素;如果第三節(jié)點和第四節(jié)點都是元素尾,則第四節(jié)點和當(dāng)前節(jié)點屬于同一個元素,根據(jù) 第四節(jié)點和當(dāng)前節(jié)點向前劃分得到第六節(jié)點,則得到當(dāng)前節(jié)點所屬的元素為以第六節(jié)點為 元素頭、第四節(jié)點為元素尾的元素;如果第三節(jié)點為元素頭、第四節(jié)點為元素尾,判斷第三節(jié)點中的元素名稱與第四節(jié)點 中的元素名稱是否相同,如果相同,則當(dāng)前節(jié)點所屬的元素為以第三節(jié)點為元素頭、第四節(jié) 點為元素尾組成的元素,如果不相同,返回錯誤;如果第三節(jié)點為元素尾、第四節(jié)點為元素頭,返回錯誤;步驟C8,劃分得到當(dāng)前節(jié)點的下一個節(jié)點,并設(shè)為當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為需要 解析的部分,如果是,返回步驟Cl,如果不是,重復(fù)執(zhí)行本步驟操作,直到當(dāng)前節(jié)點超出所述 XML報文的范圍。
13.如權(quán)利要求12所述的方法,其特征在于,所述根據(jù)第三節(jié)點和當(dāng)前節(jié)點向后劃分 得到第五節(jié)點,具體的包括步驟C8_a,劃分得到當(dāng)前節(jié)點的下一個節(jié)點,并設(shè)為第五臨時節(jié)點; 步驟C8-b,判斷第五臨時節(jié)點是否為元素尾,如果是,執(zhí)行步驟C8-c,如果不是,繼續(xù) 劃分得到第五臨時節(jié)點的下一個節(jié)點,并設(shè)為第五臨時節(jié)點,返回重新執(zhí)行步驟C8-b;步驟C8-c,判斷第五臨時節(jié)點中的元素名稱與第三節(jié)點中的元素名稱是否相同,如果 相同,則將第五臨時節(jié)點記錄為第五節(jié)點,如果不相同,劃分得到第五臨時節(jié)點的下一個節(jié) 點,并設(shè)為第五臨時節(jié)點,返回重新執(zhí)行步驟C8-b。
14.如權(quán)利要求12所述的方法,其特征在于,所述根據(jù)第四節(jié)點和當(dāng)前節(jié)點向前劃分得到第六節(jié)點,具體的包括步驟C8_a’,劃分得到當(dāng)前節(jié)點的上一個節(jié)點,并設(shè)為第六臨時節(jié)點; 步驟C8-b’,判斷第六臨時節(jié)點是否為元素頭,如果是,執(zhí)行步驟C8-c’,如果不是,繼 續(xù)劃分得到第六臨時節(jié)點的上一個節(jié)點,并設(shè)為第六臨時節(jié)點,返回重新執(zhí)行步驟C8-b’ ; 步驟C8-c’,判斷第六臨時節(jié)點中的元素名稱與第四節(jié)點中的元素名稱是否相同,如果 相同,將第六臨時節(jié)點記錄為第六節(jié)點,如果不相同,則執(zhí)行步驟劃分得到第六臨時節(jié)點的 上一個節(jié)點,并設(shè)為第六臨時節(jié)點,返回重新執(zhí)行步驟C8-b’。
15.基于權(quán)利要求1所述的一種XML報文中的節(jié)點劃分方法,一種XML報文中定位當(dāng)前 元素的第一個子元素的方法包括步驟D1,從當(dāng)前元素的元素頭的節(jié)點開始,劃分得到當(dāng)前元素的元素頭的節(jié)點的下一 個節(jié)點,并設(shè)為第七節(jié)點;步驟D2,判斷第七節(jié)點的位置是否超出了當(dāng)前元素的元素尾,如果是,返回錯誤,如果 不是,判斷第七節(jié)點的類型如果是元素頭,并且第七節(jié)點包含的元素名稱與當(dāng)前元素的元素名稱不同,則第七節(jié) 點為當(dāng)前元素的第一個子元素的元素頭,執(zhí)行步驟D3 ; 如果是元素尾,執(zhí)行步驟D4; 否則,執(zhí)行步驟D5;步驟D3,由第七節(jié)點定位得到當(dāng)前元素的第一個子元素;步驟D4,判斷第七節(jié)點與當(dāng)前元素的元素尾是否重合,如果是,則當(dāng)前元素沒有子元 素,如果不是,則返回錯誤;步驟D5,劃分得到第七節(jié)點的下一個節(jié)點,并設(shè)為第七節(jié)點,返回重新執(zhí)行步驟D2。
16.基于權(quán)利要求1所述的一種XML報文中的節(jié)點劃分方法,一種XML報文中相鄰元素 的定位方法,包括步驟E1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒有根元素,如果不是,執(zhí)行 步驟E2 ;步驟E2,根據(jù)預(yù)先約定的父元素定位方法,查找當(dāng)前元素的父元素,并定位當(dāng)前元素的 父元素的位置;步驟E3,根據(jù)所述預(yù)先約定的節(jié)點劃分方法,劃分得到當(dāng)前元素的元素尾的下一個節(jié) 點,并設(shè)為第八節(jié)點;步驟E4,判斷第八節(jié)點是否超出當(dāng)前元素的父元素的范圍 如果是,停止對當(dāng)前元素的相鄰元素的查找;如果不是,判斷第八節(jié)點的節(jié)點類型,如果是元素頭,則第八節(jié)點為當(dāng)前元素的相鄰元 素的元素頭,根據(jù)所述預(yù)先約定的元素定位方法,得到當(dāng)前元素的相鄰元素,否則,根據(jù)所 述預(yù)先約定的節(jié)點劃分方法,劃分得到第八節(jié)點的下一個節(jié)點,設(shè)為第八節(jié)點,返回重新執(zhí) 行步驟E4。
17.如權(quán)利要求16所述的方法,其特征在于,所述預(yù)先約定的父元素定位方法,具體的 包括步驟E2-1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒有父元素,如果不是,執(zhí) 行步驟E2-2 ;步驟E2-2,劃分得到當(dāng)前元素的元素頭的上一個節(jié)點,并設(shè)為第九節(jié)點; 步驟E2-3,判斷第九節(jié)點的類型,如果是元素頭,執(zhí)行步驟E2-4,否則,執(zhí)行步驟E2-5 ; 步驟E2-4,第九節(jié)點為當(dāng)前元素的父元素的元素頭,根據(jù)所述預(yù)先約定的元素定位方 法,由第九節(jié)點定位得到當(dāng)前元素的父元素;步驟E2-5,劃分得到第九節(jié)點的上一個節(jié)點,并設(shè)為第九節(jié)點,返回步驟E2-3。
18.基于權(quán)利要求1、11、12、15和16所述的方法,一種XML報文的解析方法,包括 步驟F1,獲取XML報文中的根元素,將所述根元素設(shè)為當(dāng)前元素; 步驟F2,判斷當(dāng)前元素是否有子元素,如果有,執(zhí)行步驟F3,如果沒有,執(zhí)行步驟F4 ; 步驟F3,查找當(dāng)前元素的第一個子元素,將所述第一個子元素設(shè)為當(dāng)前元素,返回步驟F2 ;步驟F4,判斷當(dāng)前元素之后是否有相鄰元素,如果有,執(zhí)行步驟F5,如果沒有,執(zhí)行步 驟F6 ;步驟F5,定位并獲取當(dāng)前元素的相鄰元素,將所述當(dāng)前元素的相鄰元素設(shè)為當(dāng)前元素, 返回步驟F2 ;步驟F6,將當(dāng)前元素的父元素設(shè)為當(dāng)前元素,并判斷當(dāng)前元素是否為根元素,如果是, 執(zhí)行步驟F7,如果不是,返回步驟F4 ; 步驟F7,所述XML報文解析完畢。
全文摘要
本發(fā)明提供了一種XML報文中節(jié)點的劃分方法,以及基于上述節(jié)點劃分方法的節(jié)點類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個子元素的方法、相鄰元素的定位方法、XML報文的解析方法,本發(fā)明提供的解析方法適合使用C語言實現(xiàn),可以應(yīng)用于嵌入式環(huán)境中,并且不需要建立節(jié)點樹,占用內(nèi)存小。
文檔編號G06F17/22GK101976244SQ20101050051
公開日2011年2月16日 申請日期2010年9月30日 優(yōu)先權(quán)日2010年9月30日
發(fā)明者于華章, 陸舟 申請人:北京飛天誠信科技有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
仁怀市| 张家川| 大洼县| 衡南县| 达日县| 甘泉县| 新兴县| 贺兰县| 清水河县| 南昌县| 襄樊市| 淮阳县| 天柱县| 太原市| 长治县| 彝良县| 都昌县| 洛阳市| 隆尧县| 新密市| 长阳| 齐河县| 沙田区| 延吉市| 邯郸县| 雷波县| 永安市| 连平县| 和政县| 镇雄县| 榆中县| 珠海市| 兴安县| 吕梁市| 富川| 阜康市| 方山县| 科尔| 峨山| 云南省| 新巴尔虎左旗|