專利名稱:對(duì)xml報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分及其對(duì)其應(yīng)用的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,特別涉及一種對(duì)XML報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分及其對(duì) 其應(yīng)用的方法。
背景技術(shù):
XML(Extensible Markup Language)即可擴(kuò)展標(biāo)記語(yǔ)言,它與 HTML—樣,都是 SGML (Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)。XML 是 Internet 環(huán) 境中跨平臺(tái)的,依賴于內(nèi)容的技術(shù),是當(dāng)前處理結(jié)構(gòu)化文檔信息的有力工具??蓴U(kuò)展標(biāo)記語(yǔ) 言XML是一種簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)語(yǔ)言,使用一系列簡(jiǎn)單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用 方便的方式建立,雖然XML占用的空間比二進(jìn)制數(shù)據(jù)要占用更多的空間,但XML極其簡(jiǎn)單易 于掌握和使用。XML廣泛的應(yīng)用于網(wǎng)絡(luò)及其相關(guān)技術(shù),目前對(duì)XML報(bào)文進(jìn)行解析的方法,普遍的為 XML DOMjXML DOM定義了訪問(wèn)和處理XML報(bào)文的標(biāo)準(zhǔn)方法,XML DOM是XML Document Object Model的縮寫(xiě),即XML報(bào)文對(duì)象模型。當(dāng)主機(jī)使用XML DOM所提供的方法進(jìn)行XML報(bào)文的 解析時(shí),需要先將XML全部節(jié)點(diǎn)進(jìn)行掃描,并在主機(jī)內(nèi)存中建立完整的節(jié)點(diǎn)樹(shù),通過(guò)節(jié)點(diǎn)樹(shù) 對(duì)XML報(bào)文中的符合條件的數(shù)據(jù)進(jìn)行查找,這種方法占用主機(jī)的內(nèi)存資源過(guò)多,尤其是當(dāng) 對(duì)XML報(bào)文的解析在單片機(jī)中進(jìn)行時(shí),如智能卡中對(duì)XML報(bào)文的解析,智能卡由于體積的限 制,本身的內(nèi)存資源較小,當(dāng)使用XML DOM的方法對(duì)XML報(bào)文進(jìn)行解析時(shí),如果XML報(bào)文過(guò) 大,則智能卡設(shè)備的內(nèi)存負(fù)擔(dān)過(guò)大。在對(duì)XML報(bào)文進(jìn)行解析時(shí),還可以采用面向?qū)ο缶幊痰姆椒ǎ褂妹嫦驅(qū)ο笳Z(yǔ)言 中提供的接口,通過(guò)編程實(shí)現(xiàn)XML解析器,使用解析器對(duì)XML報(bào)文進(jìn)行解析,但是這種方法 不適用于嵌入式環(huán)境,嵌入式環(huán)境不能支持面向?qū)ο蟮腦ML解析方法,但是由于嵌入式的 廣泛應(yīng)用,例如智能密鑰設(shè)備USB Key等,在嵌入式環(huán)境中對(duì)XML報(bào)文的解析是必不可少 的。綜上所述,現(xiàn)有技術(shù)的的缺點(diǎn)是現(xiàn)有的對(duì)XML報(bào)文的解析方法占用大量的內(nèi)存 資源或不能適用于嵌入式環(huán)境中對(duì)XML報(bào)文的解析。
發(fā)明內(nèi)容
鑒于現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,如下步驟Al,獲取當(dāng)前位置和當(dāng)前位置的值;步驟A2,判斷當(dāng)前位置的值是否超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),如果 當(dāng)前位置的值超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),返回錯(cuò)誤,否則,執(zhí)行步驟A3 ;步驟A3,判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A5,如果 不是,執(zhí)行步驟A4;步驟A4,將當(dāng)前位置移動(dòng)一個(gè)單位,并將移動(dòng)一個(gè)單位后得到的字符的位置作為 當(dāng)前位置,返回執(zhí)行步驟A2;
步驟A5,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)邊界,并將當(dāng)前位置移動(dòng)一個(gè)單位,將移 動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置;步驟A6,判斷當(dāng)前位置的值是否超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),如果 當(dāng)前位置的值超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),返回錯(cuò)誤,否則,執(zhí)行步驟A7 ;步驟A7,判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果 不是,將當(dāng)前位置按與步驟A5中當(dāng)前位置移動(dòng)方向相同的方向移動(dòng)一個(gè)單位,將移動(dòng)一個(gè) 單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟A6 ;步驟A8,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的另一個(gè)節(jié)點(diǎn)邊界,得到當(dāng)前節(jié)點(diǎn),所述節(jié)點(diǎn)邊 界包括節(jié)點(diǎn)頭和節(jié)點(diǎn)尾。優(yōu)選地,所述當(dāng)前位置的值為當(dāng)前位置的字符相對(duì)于所述XML報(bào)文起始位置的偏 移。相應(yīng)地,所述當(dāng)前節(jié)點(diǎn)使用一個(gè)二元組進(jìn)行表示,所述二元組包括所述當(dāng)前節(jié)點(diǎn) 的節(jié)點(diǎn)頭和節(jié)點(diǎn)尾,在所述二元組中,使用所述當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭相對(duì)于所述XML報(bào)文中 起始位置的偏移表示所述節(jié)點(diǎn)頭,使用所述當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾相對(duì)于所述XML報(bào)文中起始 位置的偏移表示所述節(jié)點(diǎn)尾。優(yōu)選地,步驟A4具體的包括將當(dāng)前位置向前移動(dòng)一個(gè)單位,并將所述向前移動(dòng)一個(gè)單位后得到的字符的位置 作為當(dāng)前位置,并將表示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A2 ;或,將當(dāng)前位置向后移動(dòng)一個(gè)單位,并將所述向后移動(dòng)一個(gè)單位后得到的字符的位置 作為當(dāng)前位置,并將表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A2。 優(yōu)選地,步驟A5具體的包括將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭,并將當(dāng)前位置向后移動(dòng)一個(gè)單位,將向后移 動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞增1 ;或,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,并將當(dāng)前位置向前移動(dòng)一個(gè)單位,將向前移 動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞減1。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭,并將當(dāng)前位置向后移 動(dòng)一個(gè)單位時(shí),步驟A7具體的為判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將 當(dāng)前位置向后移動(dòng)一個(gè)單位,將向后移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置,并 令表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A6。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,并將當(dāng)前位置向前移 動(dòng)一個(gè)單位時(shí),步驟A7具體的為判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將 當(dāng)前位置向前移動(dòng)一個(gè)單位,將向前移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置,并 令表示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A6。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭,并將當(dāng)前位置向后移 動(dòng)一個(gè)單位時(shí),步驟A8具體的為
將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,得到當(dāng)前節(jié)點(diǎn)。相應(yīng)地,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,并將當(dāng)前位置向前移 動(dòng)一個(gè)單位時(shí),步驟A8具體的為將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭,得到當(dāng)前節(jié)點(diǎn)。優(yōu)選地,所述將當(dāng)前位置移動(dòng)一個(gè)單位為由當(dāng)前字符的位置移動(dòng)一個(gè)字符的距罔。通過(guò)上述一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,本發(fā)明可以實(shí)現(xiàn)一種XML報(bào)文中節(jié)點(diǎn) 類型判斷方法,具體的為步驟B 1,判斷當(dāng)前節(jié)點(diǎn)是否為以“ < ”開(kāi)頭,以“ > ”結(jié)尾,如果是,執(zhí)行步驟B2, 如果不是,執(zhí)行步驟B7 ;步驟B2,判斷當(dāng)前節(jié)點(diǎn)中字符“<”之后的第一個(gè)位置對(duì)應(yīng)的字符,如果為“? ”,執(zhí) 行步驟B3,如果為“ ! ”,執(zhí)行步驟B4,如果為“/”,執(zhí)行步驟B5,否則,執(zhí)行步驟B6 ;步驟B3,判斷當(dāng)前節(jié)點(diǎn)中字符“ >,,之前的位置所對(duì)應(yīng)的字符是否為“ ? ”,如果是 “ ? ”,判斷當(dāng)前節(jié)點(diǎn)中“ <,,之后的下一個(gè)位置的“? ”與“ >,,之前第一個(gè)位置的“ ?,,是否 重合,如果不重合,則記錄當(dāng)前節(jié)點(diǎn)為XML報(bào)文的頭,如果重合,返回錯(cuò)誤,如果不是“ ? ”,報(bào) 文錯(cuò)誤;步驟B4,記錄當(dāng)前節(jié)點(diǎn)為不需要解析的部分;步驟B5,記錄當(dāng)前節(jié)點(diǎn)為元素尾;步驟B6,判斷當(dāng)前節(jié)點(diǎn)中字符“>”前的一個(gè)字符是否為“/”,如果是,則當(dāng)前節(jié)點(diǎn) 為一個(gè)完整的元素,否則,當(dāng)前節(jié)點(diǎn)為一個(gè)元素的元素頭;步驟B7,判斷當(dāng)前節(jié)點(diǎn)是否以“>”開(kāi)頭,以“<”結(jié)尾,如果是,則記錄當(dāng)前節(jié)點(diǎn)為 元素中間的值,如果不是,返回錯(cuò)誤,結(jié)束判斷節(jié)點(diǎn)類型。通過(guò)上述一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,本發(fā)明可以實(shí)現(xiàn)一種XML報(bào)文中定位 元素的方法,具體的包括步驟Cl,判斷當(dāng)前節(jié)點(diǎn)的類型,如果是完整的元素,執(zhí)行步驟C2,如果是元素頭, 執(zhí)行步驟C3,如果是元素尾,執(zhí)行步驟C5,如果是元素中間的值,執(zhí)行步驟C7,如果是不需 要解析的部分,執(zhí)行步驟C8,如果是報(bào)文頭,返回錯(cuò)誤;步驟C2,記錄當(dāng)前節(jié)點(diǎn)所屬的元素即為所述步驟Cl中的完整的元素;步驟C3,劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn);步驟C4,判斷第一節(jié)點(diǎn)的節(jié)點(diǎn)類型如果是元素尾,判斷第一節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如 果相同,則當(dāng)前節(jié)點(diǎn)所屬的元素為以當(dāng)前節(jié)點(diǎn)尾元素頭、第一節(jié)點(diǎn)尾元素尾組成的元素,如 果不相同,則劃分得到第一節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn),返回重新執(zhí)行步驟C4 ;如果是元素頭,判斷第一節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如 果相同,則返回錯(cuò)誤,結(jié)束對(duì)所述XML報(bào)文的解析,如果不相同,劃分得到第一節(jié)點(diǎn)的下一 個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn),返回重新執(zhí)行步驟C4 ;如果是元素中間的值,劃分得到第一節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn),返回重 新執(zhí)行步驟C4 ;步驟C5,劃分得到當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn);
步驟C6,判斷第二節(jié)點(diǎn)的節(jié)點(diǎn)類型如果是元素頭,判斷第二節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如 果相同,則得到當(dāng)前節(jié)點(diǎn)所屬元素為以第二節(jié)點(diǎn)為元素頭、當(dāng)前節(jié)點(diǎn)為元素尾組成的元素, 如果不相同,劃分得到第二節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn),返回重新執(zhí)行步驟C6;如果是元素尾,判斷第二節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如 果相同,返回錯(cuò)誤,結(jié)束對(duì)所述XML報(bào)文的解析,如果不相同,則根據(jù)所述預(yù)先約定的節(jié)點(diǎn) 劃分方法,劃分得到第二節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn),返回重新執(zhí)行步驟C6;如果是元素中間的值,劃分得到第二節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn),返回重 新執(zhí)行步驟C6 ;步驟C7,劃分得到當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),設(shè)為第三節(jié)點(diǎn),劃分得到當(dāng)前節(jié)點(diǎn)的下 一個(gè)節(jié)點(diǎn),設(shè)為第四節(jié)點(diǎn),并判斷第三節(jié)點(diǎn)和第四節(jié)點(diǎn)的類型如果第三節(jié)點(diǎn)和第四節(jié)點(diǎn)都是元素頭,則第三節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)屬于同一個(gè)元素, 根據(jù)第三節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向后劃分得到第五節(jié)點(diǎn),則得到當(dāng)前節(jié)點(diǎn)所屬的元素為以第三節(jié) 點(diǎn)為元素頭、第五節(jié)點(diǎn)為元素尾的元素;如果第三節(jié)點(diǎn)和第四節(jié)點(diǎn)都是元素尾,則第四節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)屬于同一個(gè)元素, 根據(jù)第四節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向前劃分得到第六節(jié)點(diǎn),則得到當(dāng)前節(jié)點(diǎn)所屬的元素為以第六節(jié) 點(diǎn)為元素頭、第四節(jié)點(diǎn)為元素尾的元素;如果第三節(jié)點(diǎn)為元素頭、第四節(jié)點(diǎn)為元素尾,判斷第三節(jié)點(diǎn)中的元素名稱與第四 節(jié)點(diǎn)中的元素名稱是否相同,如果相同,則當(dāng)前節(jié)點(diǎn)所屬的元素為以第三節(jié)點(diǎn)為元素頭、第 四節(jié)點(diǎn)為元素尾組成的元素,如果不相同,返回錯(cuò)誤;如果第三節(jié)點(diǎn)為元素尾、第四節(jié)點(diǎn)為元素頭,返回錯(cuò)誤;步驟C8,劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為當(dāng)前節(jié)點(diǎn),判斷當(dāng)前節(jié)點(diǎn)是否為 需要解析的部分,如果是,返回步驟Cl,如果不是,重復(fù)執(zhí)行本步驟操作,直到當(dāng)前節(jié)點(diǎn)超出 所述XML報(bào)文的范圍。優(yōu)選地,所述根據(jù)第三節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向后劃分得到第五節(jié)點(diǎn),具體的包括步驟C8_a,劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第五臨時(shí)節(jié)點(diǎn);步驟C8_b,判斷第五臨時(shí)節(jié)點(diǎn)是否為元素尾,如果是,執(zhí)行步驟C8-c,如果不 是,繼續(xù)劃分得到第五臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第五臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟 C8-b ;步驟C8-c,判斷第五臨時(shí)節(jié)點(diǎn)中的元素名稱與第三節(jié)點(diǎn)中的元素名稱是否相同, 如果相同,則將第五臨時(shí)節(jié)點(diǎn)記錄為第五節(jié)點(diǎn),如果不相同,劃分得到第五臨時(shí)節(jié)點(diǎn)的下一 個(gè)節(jié)點(diǎn),并設(shè)為第五臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟C8-b。優(yōu)選地,所述根據(jù)第四節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向前劃分得到第六節(jié)點(diǎn),具體的包括步驟C8_a’,劃分得到當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第六臨時(shí)節(jié)點(diǎn);步驟C8_b’,判斷第六臨時(shí)節(jié)點(diǎn)是否為元素頭,如果是,執(zhí)行步驟C8-c’,如果不 是,繼續(xù)劃分得到第六臨時(shí)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第六臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟 C8-b,;步驟C8-c’,判斷第六臨時(shí)節(jié)點(diǎn)中的元素名稱與第四節(jié)點(diǎn)中的元素名稱是否相同, 如果相同,將第六臨時(shí)節(jié)點(diǎn)記錄為第六節(jié)點(diǎn),如果不相同,則執(zhí)行步驟劃分得到第六臨時(shí)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第六臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟C8_b’。通過(guò)上述一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,本發(fā)明可以實(shí)現(xiàn)一種XML報(bào)文中定位 當(dāng)前元素的第一個(gè)子元素的方法,具體的包括步驟D1,從當(dāng)前元素的元素頭的節(jié)點(diǎn)開(kāi)始,劃分得到當(dāng)前元素的元素頭的節(jié)點(diǎn)的 下一個(gè)節(jié)點(diǎn),并設(shè)為第七節(jié)點(diǎn);步驟D2,判斷第七節(jié)點(diǎn)的位置是否超出了當(dāng)前元素的元素尾,如果是,返回錯(cuò)誤, 如果不是,判斷第七節(jié)點(diǎn)的類型如果是元素頭,并且第七節(jié)點(diǎn)包含的元素名稱與當(dāng)前元素的元素名稱不同,則第 七節(jié)點(diǎn)為當(dāng)前元素的第一個(gè)子元素的元素頭,執(zhí)行步驟D3 ;如果是元素尾,執(zhí)行步驟D4 ;否則,執(zhí)行步驟D5;步驟D3,由第七節(jié)點(diǎn)定位得到當(dāng)前元素的第一個(gè)子元素;步驟D4,判斷第七節(jié)點(diǎn)與當(dāng)前元素的元素尾是否重合,如果是,則當(dāng)前元素沒(méi)有子 元素,如果不是,則返回錯(cuò)誤;步驟D5,劃分得到第七節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第七節(jié)點(diǎn),返回重新執(zhí)行步驟 D2。通過(guò)上述一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,本發(fā)明可以實(shí)現(xiàn)一種XML報(bào)文中相鄰 元素的定位方法,具體的包括步驟E1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒(méi)有根元素,如果不是, 執(zhí)行步驟E2 ;步驟E2,根據(jù)預(yù)先約定的父元素定位方法,查找當(dāng)前元素的父元素,并定位當(dāng)前元 素的父元素的位置;步驟E3,根據(jù)所述預(yù)先約定的節(jié)點(diǎn)劃分方法,劃分得到當(dāng)前元素的元素尾的下一 個(gè)節(jié)點(diǎn),并設(shè)為第八節(jié)點(diǎn);步驟E4,判斷第八節(jié)點(diǎn)是否超出當(dāng)前元素的父元素的范圍如果是,停止對(duì)當(dāng)前元素的相鄰元素的查找;如果不是,判斷第八節(jié)點(diǎn)的節(jié)點(diǎn)類型,如果是元素頭,則第八節(jié)點(diǎn)為當(dāng)前元素的相 鄰元素的元素頭,根據(jù)所述預(yù)先約定的元素定位方法,得到當(dāng)前元素的相鄰元素,否則,根 據(jù)所述預(yù)先約定的節(jié)點(diǎn)劃分方法,劃分得到第八節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),設(shè)為第八節(jié)點(diǎn),返回重 新執(zhí)行步驟E4。優(yōu)選地,所述預(yù)先約定的父元素定位方法,具體的包括步驟E2-1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒(méi)有父元素,如果不 是,執(zhí)行步驟E2-2;步驟E2-2,劃分得到當(dāng)前元素的元素頭的上一個(gè)節(jié)點(diǎn),并設(shè)為第九節(jié)點(diǎn);步驟E2-3,判斷第九節(jié)點(diǎn)的類型,如果是元素頭,執(zhí)行步驟E2-4,否則,執(zhí)行步驟 E2-5 ;步驟E2-4,第九節(jié)點(diǎn)為當(dāng)前元素的父元素的元素頭,根據(jù)所述預(yù)先約定的元素定 位方法,由第九節(jié)點(diǎn)定位得到當(dāng)前元素的父元素;步驟E2-5,劃分得到第九節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第九節(jié)點(diǎn),返回步驟E2-3。
通過(guò)上述一種一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,以及基于上述節(jié)點(diǎn)劃分方法的節(jié) 點(diǎn)類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個(gè)子元素的方法、相鄰元素的定位方 法,本發(fā)明可以實(shí)現(xiàn)一種XML報(bào)文的解析方法,具體的包括步驟F1,獲取XML報(bào)文中的根元素,將所述根元素設(shè)為當(dāng)前元素;步驟F2,判斷當(dāng)前元素是否有子元素,如果有,執(zhí)行步驟F3,如果沒(méi)有,執(zhí)行步驟 F4 ;步驟F3,查找當(dāng)前元素的第一個(gè)子元素,將所述第一個(gè)子元素設(shè)為當(dāng)前元素,返回 步驟F2 ;步驟F4,判斷當(dāng)前元素之后是否有相鄰元素,如果有,執(zhí)行步驟F5,如果沒(méi)有,執(zhí) 行步驟F6;步驟F5,定位并獲取當(dāng)前元素的相鄰元素,將所述當(dāng)前元素的相鄰元素設(shè)為當(dāng)前 元素,返回步驟F2;步驟F6,將當(dāng)前元素的父元素設(shè)為當(dāng)前元素,并判斷當(dāng)前元素是否為根元素,如果 是,執(zhí)行步驟F7,如果不是,返回步驟F4 ;步驟F7,所述XML報(bào)文解析完畢。本發(fā)明實(shí)施例提供的技術(shù)方案帶來(lái)的有益效果是一種XML報(bào)文中節(jié)點(diǎn)的劃分方 法,以及基于上述節(jié)點(diǎn)劃分方法的節(jié)點(diǎn)類型判斷方法、定位元素方法、定位當(dāng)前元素的第一 個(gè)子元素的方法、相鄰元素的定位方法、XML報(bào)文的解析方法,本發(fā)明提供的解析方法適合 使用C語(yǔ)言實(shí)現(xiàn),可以應(yīng)用于嵌入式環(huán)境中,并且不需要建立節(jié)點(diǎn)樹(shù),占用內(nèi)存小。
圖1為本發(fā)明具體實(shí)施例中所提供的XML報(bào)文的元素結(jié)構(gòu)樹(shù)形圖;圖2為本發(fā)明具體實(shí)施例一中所提供的一種對(duì)XML報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分的方法 流程圖;圖3為本發(fā)明具體實(shí)施例二中所提供的一種XML報(bào)文中節(jié)點(diǎn)類型的判斷方法流程 圖;圖4為本發(fā)明具體實(shí)施例三中所提供的一種XML報(bào)文中定位元素的方法流程圖;圖5為本發(fā)明具體實(shí)施例四中所提供的一種XML報(bào)文中定位當(dāng)前元素的第一個(gè)子 元素的方法流程圖;圖6為本發(fā)明具體實(shí)施例五中所提供的一種XML報(bào)文中相鄰元素的定位方法流程 圖;圖7為本發(fā)明具體實(shí)施例六中所提供的一種XML報(bào)文的解析方法流程圖。
具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明,但不作為對(duì)本發(fā)明的限定。以下實(shí)施例提供了對(duì)XML報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分及其對(duì)其應(yīng)用的方法,其中,對(duì) 節(jié)點(diǎn)進(jìn)行劃分的方法的應(yīng)用包括節(jié)點(diǎn)類型判斷、定位元素方法、定位當(dāng)前元素的第一個(gè)子 元素、定位相鄰元素、XML報(bào)文的解析。為了便于說(shuō)明,以下提供了如下一段XML報(bào)文,實(shí)施例1到實(shí)施例5均為以此XML報(bào)文進(jìn)行說(shuō)明< ?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="時(shí)間“>2009-12_06</ TranDate><JnlNo>xxxxxxx</JnlNo>〈/Fields〉</SignData>為了便于說(shuō)明,在本發(fā)明中對(duì)報(bào)文中的數(shù)據(jù)形式做如下定義將XML報(bào)文中以“<”開(kāi)頭、以“>”結(jié)尾的字符串或以“>”開(kāi)頭、以“<”結(jié) 尾的字符串定義為一個(gè)節(jié)點(diǎn),例如“<SignData>”為一個(gè)節(jié)點(diǎn),” “> 12345 <”也為一 個(gè)節(jié)點(diǎn),特別地,以< xml開(kāi)頭的節(jié)點(diǎn)為XML報(bào)文的頭,例如節(jié)點(diǎn)“〈? xml version ="1.0〃 encoding = " utf-8" ? >”為本實(shí)施例所提供的XML報(bào)文的頭;將形如“〈Amount name ="金額‘‘>1000. 5</Amount>”的字符串定為為一個(gè)元 素,元素至少由一個(gè)節(jié)點(diǎn)組成,在上述元素中,由三個(gè)節(jié)點(diǎn)組成,完整的元素應(yīng)包括元素頭、 值、元素尾,在上述元素中,“〈Amount name="金額“ > ”為元素頭,1000. 5為值,“</ Amount〉”為元素尾,在一個(gè)元素的元素尾中“</”和“>”之間的字符串為該元素的名稱, 在該元素中,可以將該元素稱為元素Amount,1000. 5為一個(gè)文本節(jié)點(diǎn),因此,上述元素可 以說(shuō)成是元素Amount擁有一個(gè)值為1000. 5的文本節(jié)點(diǎn),需要注意的是,1000. 5不是元素 Amount的值,在上述元素中,“name="金額“”為元素屬性,并且元素屬性只能存在于 元素頭中;其中,元素可以進(jìn)行嵌套,一個(gè)元素應(yīng)該以“<元素名稱”開(kāi)頭,“</元素名稱〉”結(jié) 尾,例如在上述XML報(bào)文中,元素SignData中嵌套有元素TradeType、SubType、Timestamp、 Fields,兀素 Fields 中嵌套有兀素 PayerAcNo> PayeeAcNo> Amount> TranDate、JnlNo ;XML報(bào)文可以解析為元素樹(shù),為了便于了解XML報(bào)文的結(jié)構(gòu),使用元素樹(shù)表示上述 XML報(bào)文,如圖1 ;實(shí)施例1 在本實(shí)施例中,提供了 一種對(duì)XML報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分的方法,根據(jù)此方法,可 以在XML報(bào)文的任意位置開(kāi)始對(duì)XML報(bào)文進(jìn)行掃描,完成節(jié)點(diǎn)的劃分過(guò)程,參見(jiàn)圖2,具體的如下步驟101,獲取當(dāng)前位置和當(dāng)前位置的值;在本發(fā)明中,進(jìn)行如下約定,給定一個(gè)XML報(bào)文,“位置”指的是相對(duì)于報(bào)文起始處 的偏移量,“向前移動(dòng)”指的是偏移量減小,“向后移動(dòng)”指的是偏移量增加,優(yōu)選地,向前移 動(dòng)使用“-1”表示向前移動(dòng)一個(gè)字符,向后移動(dòng)使用“+1”表示向后移動(dòng)一個(gè)字符;優(yōu)選地,XML報(bào)文的起始位置即第一個(gè)字符的位置使用0表示,從起始位置向后移 動(dòng)一個(gè)單位得到XML報(bào)文的第二個(gè)字符,則第二個(gè)字符的位置使用1表示,依此類推,使用 值和偏移可表示當(dāng)前XML報(bào)文的所有位置。在本發(fā)明中,設(shè)有當(dāng)前位置,當(dāng)前位置表示XML解析器正在處理的XML報(bào)文中的字 符所在的位置,不固定為某一個(gè)字符,為了便于說(shuō)明本實(shí)施例中將當(dāng)前字符的位置的值以A 進(jìn)行表示;一般地,對(duì)XML報(bào)文的解析由報(bào)文的初始位置開(kāi)始,在本實(shí)施例中,以上述XML報(bào) 文為例進(jìn)行說(shuō)明,以對(duì)XML報(bào)文的初始位置開(kāi)始進(jìn)行節(jié)點(diǎn)劃分和掃描為例進(jìn)行說(shuō)明,因此 將上述XML報(bào)文的第一個(gè)字符作為當(dāng)前位置,此時(shí)A的值具體的為0 ;需要說(shuō)明的是,在本實(shí)施例所提供的節(jié)點(diǎn)劃分方法,優(yōu)選地以一個(gè)二元組來(lái)表示 一個(gè)節(jié)點(diǎn),例如二元組可以為(al,a2),表示當(dāng)前節(jié)點(diǎn)的位置和長(zhǎng)度,其中,al為當(dāng)前節(jié)點(diǎn) 的節(jié)點(diǎn)頭的位置的值,用來(lái)表示當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭的位置,a2為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾的位置 的值,用來(lái)表示當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾的位置,a2-al+l即是節(jié)點(diǎn)的長(zhǎng)度;步驟102,判斷當(dāng)前位置的值是否超過(guò)XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),如果當(dāng)前位 置的值超過(guò)了其所屬XML報(bào)文的總長(zhǎng)度或?yàn)樨?fù)數(shù),返回錯(cuò)誤,否則,執(zhí)行步驟103 ;步驟103,判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“ < ”或“ >”,如果是,執(zhí)行步驟105,如 果不是,執(zhí)行步驟104;步驟104,將當(dāng)前位置移動(dòng)一個(gè)單位,將移動(dòng)一個(gè)單位后得到的字符作為當(dāng)前位 置,執(zhí)行步驟102 ;其中,在本實(shí)施例中,移動(dòng)一個(gè)單位具體的為移動(dòng)一個(gè)字符的長(zhǎng)度;在本步驟中,將當(dāng)前位置移動(dòng)移動(dòng)一個(gè)單位可以向前移動(dòng),也可以向后移動(dòng),因 此,步驟104具體的可以為將當(dāng)前位置向前移動(dòng)一個(gè)單位,將向前移動(dòng)一個(gè)單位后得到的字符作為當(dāng)前位 置,并將表示當(dāng)前位置的值遞減1,執(zhí)行步驟102,或,將當(dāng)前位置向后移動(dòng)一個(gè)單位,將向后移動(dòng)一個(gè)單位后得到的字符作為當(dāng)前位 置,并將表示當(dāng)前位置的值遞增1,執(zhí)行步驟102,步驟105,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)邊界,并將當(dāng)前位置移動(dòng)一個(gè)單位,將 移動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置;在本實(shí)施例中,節(jié)點(diǎn)邊界包括節(jié)點(diǎn)頭和節(jié)點(diǎn)尾;因此,當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭時(shí),步驟105具體的為將 當(dāng)前位置記錄為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭al,并將當(dāng)前位置向后移動(dòng)一個(gè)單位,即令A(yù) = al+Ι,將 移動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置;例如,在本實(shí)施例中,設(shè)當(dāng)前位置A = 0,則當(dāng)前位置的字符為“<”,將當(dāng)前位置A=0作為節(jié)點(diǎn)的節(jié)點(diǎn)頭,令al = 0,并且將當(dāng)前位置向后移動(dòng)一個(gè)單位,使得當(dāng)前位置為A =1 ;當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾時(shí),步驟105具體的為將當(dāng)前 位置記錄為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾a2,并將當(dāng)前位置向前移動(dòng)一個(gè)單位,即令A(yù) = a2_l,將向前 移動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置;在本發(fā)明中,當(dāng)前位置、當(dāng)前節(jié)點(diǎn)同當(dāng)前元素一樣,表示XML解析器正在處理的對(duì) 象,不固定為某一具體對(duì)象,當(dāng)前位置、當(dāng)前節(jié)點(diǎn)所指代的對(duì)象由上一步驟指示得到,相應(yīng) 的,用于表示當(dāng)前位置的值A(chǔ),也為相同情況,隨著當(dāng)前位置的改變而改變。步驟106,判斷當(dāng)前位置的值是否超過(guò)XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),如果當(dāng)前位 置的值超過(guò)了其所屬XML報(bào)文的總長(zhǎng)度或?yàn)樨?fù)數(shù),返回錯(cuò)誤,否則,執(zhí)行步驟107 ;在本實(shí)施例中,執(zhí)行到此步驟時(shí),當(dāng)前位置的值為1,不為負(fù)數(shù)且不超過(guò)XML報(bào)文 的總長(zhǎng)度,則執(zhí)行步驟107;步驟107,判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“ < ”或“ >”,如果是,執(zhí)行步驟108,如 果不是,將當(dāng)前位置按與步驟105中當(dāng)前位置移動(dòng)方向相同的方向移動(dòng)一個(gè)單位,將移動(dòng) 一個(gè)單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟106 ;具體地,在本實(shí)施例中,當(dāng)步驟105中,將當(dāng)前位置記錄為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭al, 并將當(dāng)前位置向后移動(dòng)一個(gè)單位時(shí),步驟107具體的為判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“ < ”或“ > ”,如果是,執(zhí)行步驟108,如果不是, 將當(dāng)前位置向后移動(dòng)一個(gè)單位,將向后移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置, 并將當(dāng)前位置的值遞增1,返回執(zhí)行步驟106 ;例如在本實(shí)施例中,當(dāng)前位置A = 1時(shí),對(duì)應(yīng)的字符為“ ? ”,不是“ < ”或“ > ”,因 此需要將當(dāng)前位置向后移動(dòng)一個(gè)單位,即令當(dāng)前位置A = 2,并返回執(zhí)行步驟106 ;當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾時(shí),步驟105具體的為將當(dāng)前 位置記錄為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾a2時(shí),步驟107具體的為判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“ < ”或“ > ”,如果是,執(zhí)行步驟108,如果不是, 將當(dāng)前位置向前移動(dòng)一個(gè)單位,將向前移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置, 并將當(dāng)前位置的值遞減1,返回執(zhí)行步驟106 ;步驟108,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的另一個(gè)節(jié)點(diǎn)邊界,得到當(dāng)前節(jié)點(diǎn)。具體地,當(dāng)步驟105中,將當(dāng)前位置記錄為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭al,并將當(dāng)前位置向 后移動(dòng)一個(gè)單位時(shí),步驟108具體的為將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾a2,得到當(dāng)前節(jié)點(diǎn)(al,a2)。當(dāng)步驟105中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾時(shí),步驟105具體的為將當(dāng)前 位置記錄為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾a2時(shí),步驟108具體的為將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭al,得到當(dāng)前節(jié)點(diǎn)(al,a2)。其中,由于步驟101中以當(dāng)前位置A = 0開(kāi)始對(duì)節(jié)點(diǎn)進(jìn)行劃分為例進(jìn)行說(shuō)明,在步 驟107中,由于當(dāng)前位置不是字符“<”或“>”,因此將當(dāng)前位置向后移動(dòng)一個(gè)單位,再返回 執(zhí)行步驟106,只要當(dāng)前位置的字符不為“<”或“>”,則將當(dāng)前位置以一個(gè)字符為單位一直 后移,并且每次后移后,判斷當(dāng)前位置是否為“ < ”或“ > ”,在本實(shí)施例中,當(dāng)當(dāng)前位置A = 39時(shí),得到字符“>”,判斷得到為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,因此上述XML報(bào)文的第一個(gè)節(jié)點(diǎn)使用二元組表示為(0,39),節(jié)點(diǎn)長(zhǎng)度為40,當(dāng)前節(jié)點(diǎn)具體的為"< ? xml version = “ 1.0〃 encoding = “ utf-8“ ? >,,通過(guò)上述方法,可以由XML報(bào)文的任意位置開(kāi)始將XML報(bào)文進(jìn)行節(jié)點(diǎn)的劃分,本實(shí) 施例中所提供的節(jié)點(diǎn)劃分方法,使用數(shù)組表示一個(gè)節(jié)點(diǎn),數(shù)組中為節(jié)點(diǎn)的節(jié)點(diǎn)頭和節(jié)點(diǎn)尾 的偏移,在使用上述節(jié)點(diǎn)劃分方法進(jìn)行XML報(bào)文的解析時(shí),不需要將全部節(jié)點(diǎn)的字符讀入 內(nèi)存,可以節(jié)省內(nèi)存空間,尤其適用于嵌入式環(huán)境中或在內(nèi)存較小的智能密鑰設(shè)備中應(yīng)用。實(shí)施例2基于實(shí)施例1所提供的一種節(jié)點(diǎn)劃分方法,本實(shí)施例提供了一種XML報(bào)文中節(jié)點(diǎn) 類型的判斷方法,參加圖3,具體的如下步驟201,判斷當(dāng)前節(jié)點(diǎn)是否為以“<”開(kāi)頭,以“>”結(jié)尾,如果是,則執(zhí)行步驟 202,如果不是,執(zhí)行步驟207 ;在本步驟中,劃分得到下一個(gè)節(jié)點(diǎn)的方法與實(shí)施例1中相同,這里不再贅述;步驟202,判斷當(dāng)前節(jié)點(diǎn)中字符“ <,,之后的第一個(gè)位置對(duì)應(yīng)的字符,如果為“ ? ”, 執(zhí)行步驟203,如果為“ ! ”,執(zhí)行步驟204,如果為“/”,執(zhí)行步驟205,否則,執(zhí)行步驟206 ;步驟203,判斷當(dāng)前節(jié)點(diǎn)中字符“>”之前的位置所對(duì)應(yīng)的字符是否為“ ?”;如果是,判斷“<”之后的下一個(gè)位置的“? ”與“>”之前第一個(gè)位置的“? ”是否 重合,如果不重合,則記錄所述節(jié)點(diǎn)為XML報(bào)文的頭,如果重合,報(bào)錯(cuò);例如在本實(shí)施例中,節(jié)點(diǎn)頭為〈? xml version = 〃 1. 0 “ encoding ="utf-8" >,即為以‘‘<”開(kāi)頭,以“>”結(jié)尾的節(jié)點(diǎn),并且當(dāng)前節(jié)點(diǎn)中字符“<”之后的 第一個(gè)“? ”與由字符“>”向前讀取出現(xiàn)的第一個(gè)“?”的位置不重合;如果不是,則報(bào)錯(cuò),當(dāng)前報(bào)文有誤;步驟204,記錄當(dāng)前節(jié)點(diǎn)為不需要解析的部分;需要說(shuō)明的是,在本實(shí)施例中,以“< ! 一”開(kāi)頭的節(jié)點(diǎn)為XML報(bào)文注釋,以“< ! D0CTYPE"開(kāi)頭的節(jié)點(diǎn)為報(bào)文類型定義,以“< ! [CDATA”開(kāi)頭的節(jié)點(diǎn)為無(wú)需解析的文本;步驟205,記錄當(dāng)前節(jié)點(diǎn)為元素尾;其中,在XML報(bào)文中,以“< /”開(kāi)頭的節(jié)點(diǎn)為元素的元素尾;步驟206,判斷當(dāng)前節(jié)點(diǎn)中字符“>”前的一個(gè)字符是否為“/”,如果是,則記錄當(dāng) 前節(jié)點(diǎn)為一個(gè)完整的元素,否則,記錄當(dāng)前節(jié)點(diǎn)為一個(gè)元素的元素頭。其中,在XML報(bào)文中,元素的名稱包含在元素頭和元素尾的節(jié)點(diǎn)中,在元素尾的 節(jié)點(diǎn)中,元素的名稱是“</”和“>”之間的字符串,例如在上述XML報(bào)文中,節(jié)點(diǎn)“</ Timestamp)"為元素尾,"Timestamp"為元素名稱;在元素頭節(jié)點(diǎn)中,元素的名稱是‘‘ < ”到 第一個(gè)空格之間的字符串,如果沒(méi)有空格,就是“ <,,和“ > ”之間的字符串;步驟207,判斷當(dāng)前節(jié)點(diǎn)是否以“ > ”開(kāi)頭,以“ < ”結(jié)尾,如果是,則記錄當(dāng)前節(jié)點(diǎn) 為元素中間的值,如果不是,返回錯(cuò)誤,停止對(duì)節(jié)點(diǎn)類型的判斷。其中,在XML報(bào)文中,一個(gè)節(jié)點(diǎn)應(yīng)以“〈”開(kāi)頭,以“〉”結(jié)尾,或以“〉”開(kāi)頭,以“〈”結(jié)尾。本實(shí)施例提供了一種基于實(shí)施例1所提供的節(jié)點(diǎn)劃分方法的節(jié)點(diǎn)類型判斷方法, 根據(jù)所述節(jié)點(diǎn)類型判斷方法可以對(duì)劃分得到的任何節(jié)點(diǎn)的類型進(jìn)行判斷,并記錄節(jié)點(diǎn)類型。
實(shí)施例3基于實(shí)施例1所提供的一種節(jié)點(diǎn)劃分方法,本實(shí)施例提供了一種XML報(bào)文中定 位元素的方法,所述定位元素的方法可以由任意節(jié)點(diǎn)定位其所屬的元素,參加圖4,具體的 為在本實(shí)施例中,為了便于說(shuō)明,設(shè)一個(gè)任意節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)Ni,并且設(shè)節(jié)點(diǎn)m所 屬的元素為M,元素M使用一個(gè)二元組表示,二元組中分別為元素M的元素頭和元素尾;步驟301,判斷當(dāng)前節(jié)點(diǎn)的類型,如果是完整元素,執(zhí)行步驟302,如果是元素頭, 執(zhí)行步驟303,如果是元素尾,執(zhí)行步驟305,如果是元素中間的值,執(zhí)行步驟307,如果是不 需要解析的部分,執(zhí)行步驟308,如果是報(bào)文頭,返回錯(cuò)誤;其中,判斷節(jié)點(diǎn)類型的方法為實(shí)施例2所提供的方法,這里不再贅述;并且,在本實(shí)施例中,元素中間的值,指的是一個(gè)元素中,元素頭和元素尾中間的 值,例如在元素“<Timestamp>12345</Timestamp>”中,12345即為元素之間的值;步驟302,記錄當(dāng)前節(jié)點(diǎn)附所屬元素為M(Ni,Ni);步驟303,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,對(duì)XML報(bào)文中當(dāng)前節(jié)點(diǎn)m后的字 符劃分得到下一個(gè)節(jié)點(diǎn),將所述下一個(gè)節(jié)點(diǎn)定義為節(jié)點(diǎn)N2 ;步驟304,根據(jù)實(shí)施例2所提供的節(jié)點(diǎn)類型判斷方法,判斷節(jié)點(diǎn)N2的類型如果是元素尾,則判斷節(jié)點(diǎn)N2中的元素名稱與節(jié)點(diǎn)m中的元素名稱是否相同,如 果相同,則得到當(dāng)前所屬元素為(Ni,N2),如果不相同,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方 法,繼續(xù)對(duì)XML報(bào)文中節(jié)點(diǎn)N2后的下一個(gè)節(jié)點(diǎn)進(jìn)行劃分,并將所述節(jié)點(diǎn)N2后的下一個(gè)節(jié)點(diǎn) 設(shè)為新的節(jié)點(diǎn)N2,返回步驟304,繼續(xù)判斷節(jié)點(diǎn)N2的類型;如果是元素頭,則判斷節(jié)點(diǎn)N2中的元素名稱與節(jié)點(diǎn)W中的元素名稱是否相同,如 果相同,返回錯(cuò)誤,如果不相同,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)對(duì)XML報(bào)文中節(jié) 點(diǎn)N2后的下一個(gè)節(jié)點(diǎn)進(jìn)行劃分,并將所述節(jié)點(diǎn)N2后的下一個(gè)節(jié)點(diǎn)設(shè)為新的節(jié)點(diǎn)N2,返回步 驟304,繼續(xù)判斷節(jié)點(diǎn)N2的類型;如果是元素中間的值,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)對(duì)XML報(bào)文中節(jié) 點(diǎn)N2后的下一個(gè)節(jié)點(diǎn)進(jìn)行劃分,并將所述節(jié)點(diǎn)N2后的下一個(gè)節(jié)點(diǎn)設(shè)為新的節(jié)點(diǎn)N2,返回步 驟304,繼續(xù)判斷節(jié)點(diǎn)N2的類型;步驟305,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,對(duì)XML報(bào)文中當(dāng)前節(jié)點(diǎn)m前的字 符劃分得到上一個(gè)節(jié)點(diǎn),將所述上一個(gè)節(jié)點(diǎn)定義為節(jié)點(diǎn)N3 ;步驟306,根據(jù)實(shí)施例2所提供的節(jié)點(diǎn)類型判斷方法,判斷節(jié)點(diǎn)N3的類型如果是元素頭,判斷節(jié)點(diǎn)N3中的元素名稱與節(jié)點(diǎn)m中的元素名稱是否相同,如果 相同,則得到當(dāng)前所屬元素為(N3,m),如果不相同,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法, 繼續(xù)對(duì)XML報(bào)文中節(jié)點(diǎn)N3的前一個(gè)節(jié)點(diǎn)進(jìn)行劃分,并將所述節(jié)點(diǎn)N3的前一個(gè)節(jié)點(diǎn)設(shè)為新 的節(jié)點(diǎn)N3,返回步驟306,繼續(xù)判斷節(jié)點(diǎn)N3的類型;如果是元素尾,判斷節(jié)點(diǎn)N3中的元素名稱與節(jié)點(diǎn)m中的元素名稱是否相同,如果 相同,返回錯(cuò)誤,如果不相同,根據(jù)預(yù)先約定的節(jié)點(diǎn)劃分方法,繼續(xù)對(duì)XML報(bào)文中節(jié)點(diǎn)N3的 前一個(gè)節(jié)點(diǎn)進(jìn)行劃分,并將所述節(jié)點(diǎn)N3的前一個(gè)節(jié)點(diǎn)設(shè)為新的節(jié)點(diǎn)N3,返回步驟306,繼續(xù) 判斷節(jié)點(diǎn)N3的類型;如果是元素中間的值,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)對(duì)XML報(bào)文中節(jié)點(diǎn)N3的前一個(gè)節(jié)點(diǎn)進(jìn)行劃分,并將所述節(jié)點(diǎn)N3的前一個(gè)節(jié)點(diǎn)設(shè)為新的節(jié)點(diǎn)N3,返回步驟 306,繼續(xù)判斷節(jié)點(diǎn)N3的類型;步驟307,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,對(duì)XML報(bào)文中節(jié)點(diǎn)m的前一個(gè)節(jié) 點(diǎn)N4和后一個(gè)節(jié)點(diǎn)N5進(jìn)行劃分,并判斷節(jié)點(diǎn)N4和N5的類型如果節(jié)點(diǎn)N4和N5都是元素頭,則節(jié)點(diǎn)N4和m同屬一個(gè)元素,按照方法一找到節(jié) 點(diǎn)N4和m所屬元素的元素尾N6,得到當(dāng)前節(jié)點(diǎn)所屬的元素(N4,N6);如果節(jié)點(diǎn)N4和N5都是元素尾,則節(jié)點(diǎn)N5和m同屬一個(gè)元素,按照方法二找到節(jié) 點(diǎn)N5和m所屬元素的元素頭N7,得到當(dāng)前節(jié)點(diǎn)所屬的元素為(N7,N5);如果節(jié)點(diǎn)N4為元素頭,節(jié)點(diǎn)N5為元素尾,則繼續(xù)判斷節(jié)點(diǎn)N4中所包含的元素名 稱與節(jié)點(diǎn)N5中所包含的節(jié)點(diǎn)名稱是否相同,如果相同,得到當(dāng)前節(jié)點(diǎn)所屬的元素為(N4, N5),如果不相同,返回錯(cuò)誤;如果節(jié)點(diǎn)N5為元素頭,節(jié)點(diǎn)N4為元素尾,返回錯(cuò)誤;本步驟中,所述方法一和方法二具體的為方法一a,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,劃分得到節(jié)點(diǎn)N5的下一個(gè)節(jié)點(diǎn),并設(shè)為 臨時(shí)節(jié)點(diǎn)N6 ;b,根據(jù)實(shí)施例2所提供的節(jié)點(diǎn)類型判斷方法,判斷臨時(shí)節(jié)點(diǎn)N6是否為元素尾,如 果是,執(zhí)行步驟c,如果不是,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)劃分得到臨時(shí)節(jié)點(diǎn) N6的下一個(gè)節(jié)點(diǎn),并設(shè)為臨時(shí)節(jié)點(diǎn)N6,返回重新執(zhí)行步驟b ;c,判斷臨時(shí)節(jié)點(diǎn)N6中的元素名稱與節(jié)點(diǎn)N4中的元素名稱是否相同,如果相同,則 將臨時(shí)節(jié)點(diǎn)N6置為節(jié)點(diǎn)N6,如果不相同,則根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)劃分 得到臨時(shí)節(jié)點(diǎn)N6的下一個(gè)節(jié)點(diǎn),并設(shè)為臨時(shí)節(jié)點(diǎn)N6,返回重新執(zhí)行步驟b ;方法二a’,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,劃分得到節(jié)點(diǎn)N4的上一個(gè)節(jié)點(diǎn),并設(shè)為 臨時(shí)節(jié)點(diǎn)N7 ;b’,根據(jù)實(shí)施例2所提供的節(jié)點(diǎn)類型判斷方法,判斷臨時(shí)節(jié)點(diǎn)N7是否為元素頭,如 果是,執(zhí)行步驟C’,如果不是,根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)劃分得到臨時(shí)節(jié) 點(diǎn)N7的上一個(gè)節(jié)點(diǎn),并設(shè)為臨時(shí)節(jié)點(diǎn)N7,返回重新執(zhí)行步驟b’ ;c’,判斷臨時(shí)節(jié)點(diǎn)N7中的元素名稱與節(jié)點(diǎn)N5中的元素名稱是否相同,如果相同, 則將臨時(shí)節(jié)點(diǎn)N7置為節(jié)點(diǎn)N7,如果不相同,則根據(jù)實(shí)施例1所提供的節(jié)點(diǎn)劃分方法,繼續(xù)劃 分得到臨時(shí)節(jié)點(diǎn)N7的上一個(gè)節(jié)點(diǎn),并設(shè)為臨時(shí)節(jié)點(diǎn)N7,返回重新執(zhí)行步驟b’ ;步驟308,對(duì)XML報(bào)文中節(jié)點(diǎn)m的下一個(gè)節(jié)點(diǎn)進(jìn)行劃分并設(shè)為新的節(jié)點(diǎn)Ni,判斷 節(jié)點(diǎn)W是否為需要解析的部分,如果是,返回步驟301,如果不是需要解析的部分,重新執(zhí) 行本步驟操作,繼續(xù)劃分得到下一個(gè)節(jié)點(diǎn),并判斷所述下一個(gè)節(jié)點(diǎn)是否為需要解析的部分, 直到節(jié)點(diǎn)位置超出XML報(bào)文的總長(zhǎng);在本實(shí)施例中,步驟308還可以按照如下方式實(shí)現(xiàn)步驟308’,對(duì)XML報(bào)文中節(jié)點(diǎn)m的前一個(gè)節(jié)點(diǎn)進(jìn)行劃分并設(shè)為新的節(jié)點(diǎn)Ni,判斷 節(jié)點(diǎn)W是否為需要解析的部分,如果是,返回步驟301,如果不是需要解析的部分,重新執(zhí) 行本步驟操作,繼續(xù)劃分得到前一個(gè)節(jié)點(diǎn),并判斷所述前一個(gè)節(jié)點(diǎn)是否為需要解析的部分,直到表示節(jié)點(diǎn)位置的值為負(fù)數(shù);上述步驟301到步驟308描述的為由任意節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),定位其所屬元素的 方法,由本實(shí)施例所提供的方法,還可以定位根元素1)將XML報(bào)文中的第一個(gè)節(jié)點(diǎn)設(shè)為節(jié)點(diǎn)Si,根據(jù)實(shí)施例2所提供的節(jié)點(diǎn)判斷方 法,判斷Sl是否為根元素的元素頭,如果是,執(zhí)行步驟2),如果不是,劃分得到節(jié)點(diǎn)Sl的下 一個(gè)節(jié)點(diǎn)并設(shè)為節(jié)點(diǎn)Si,繼續(xù)判斷節(jié)點(diǎn)Sl是否為根元素的元素頭;2)根據(jù)實(shí)施例1提供的節(jié)點(diǎn)劃分方法,劃分得到節(jié)點(diǎn)Sl的下一個(gè)節(jié)點(diǎn),設(shè)為節(jié)點(diǎn) S2,判斷節(jié)點(diǎn)S2的名稱與根元素的元素名稱是否相同,如果相同,則根元素為(Si,S2),如 果不相同,劃分得到節(jié)點(diǎn)S2的下一個(gè)節(jié)點(diǎn)并設(shè)為節(jié)點(diǎn)S2,繼續(xù)判斷節(jié)點(diǎn)S2的名稱是否與根 元素的元素名稱相同,直到節(jié)點(diǎn)位置超出XML報(bào)文的總長(zhǎng)。實(shí)施例4基于實(shí)施例1所提供的一種節(jié)點(diǎn)劃分方法,本實(shí)施例提供了一種XML報(bào)文中定位 當(dāng)前元素的第一個(gè)子元素的方法,參見(jiàn)圖5,具體的如下在本實(shí)施例中,為了便于說(shuō)明,設(shè)當(dāng)前元素為M= (A1,A2),其中,M表示當(dāng)前元素, 節(jié)點(diǎn)Al為當(dāng)前元素的元素頭,節(jié)點(diǎn)A2為當(dāng)前元素的元素尾,并且Al = (all, al2), A2 = (a21, a22),all為表示節(jié)點(diǎn)Al的節(jié)點(diǎn)頭位置的值,al2為表示節(jié)點(diǎn)Al的節(jié)點(diǎn)尾位置的值, a21為表示節(jié)點(diǎn)A2的節(jié)點(diǎn)頭的位置的值,a22為表示節(jié)點(diǎn)A2的節(jié)點(diǎn)尾的位置的值;步驟401,從當(dāng)前元素的元素頭的節(jié)點(diǎn)尾開(kāi)始,劃分得到當(dāng)前元素的元素頭的節(jié)點(diǎn) 的下一個(gè)節(jié)點(diǎn),設(shè)為A3;步驟402,判斷節(jié)點(diǎn)A3的位置是否超出了當(dāng)前元素的元素尾,如果是,返回錯(cuò)誤, 如果不是,執(zhí)行步驟403;步驟403,判斷節(jié)點(diǎn)A3的類型如果是元素頭且名稱與當(dāng)前元素M的名稱不同,執(zhí)行步驟404 ;;如果是元素尾,執(zhí)行步驟406 ;否則,執(zhí)行步驟407;步驟404,記錄A3為當(dāng)前元素的第一個(gè)子元素的元素頭;步驟405,根據(jù)實(shí)施例2中所提供的元素定位方法,由節(jié)點(diǎn)A3定位當(dāng)前元素的第一 個(gè)子元素;在本步驟中,由當(dāng)前元素的第一個(gè)子元素的元素頭進(jìn)行定位,定位方法與實(shí)施例2 中由任意節(jié)點(diǎn)定位其所屬元素的方法相同,這里不再贅述,需要說(shuō)明的是,在定位當(dāng)前元素 M的第一個(gè)子元素,即節(jié)點(diǎn)A3所屬元素的過(guò)程中,由節(jié)點(diǎn)A3向后劃分節(jié)點(diǎn)時(shí),不能超過(guò)位置 al2,如果超過(guò)位置al2,則報(bào)錯(cuò);步驟406,判斷所述當(dāng)前元素的下一個(gè)節(jié)點(diǎn)與當(dāng)前元素的元素尾是否重合,即節(jié)點(diǎn) A3與A2是否重合,如果是,當(dāng)前元素沒(méi)有子元素,如果不是,返回報(bào)文錯(cuò)誤;步驟407,繼續(xù)劃分得到節(jié)點(diǎn)A3的下一個(gè)節(jié)點(diǎn),并將得到的節(jié)點(diǎn)A3的下一個(gè)節(jié)點(diǎn) 設(shè)為新的節(jié)點(diǎn)A3,返回步驟402 ;本實(shí)施例提供了一種定位當(dāng)前節(jié)點(diǎn)的第一個(gè)子元素的方法,在XML報(bào)文的解析過(guò) 程中,可以定位任一個(gè)元素的第一個(gè)子元素。實(shí)施例5
基于實(shí)施例1所提供的一種節(jié)點(diǎn)劃分方法,本實(shí)施例提供了一種XML報(bào)文中相鄰 元素的定位方法,參見(jiàn)圖6,具體的如下在本實(shí)施例中,所述相鄰元素的定位方法可以由任意元素定位其相鄰元素,為了 便于說(shuō)明,將當(dāng)前元素設(shè)為A= (A4,A5),其中A為當(dāng)前元素,A4為當(dāng)前元素A的元素頭, A5為當(dāng)前元素的元素尾,并且A4 = (a41,a42),A5 = (a51,a52),a41為表示節(jié)點(diǎn)A4的節(jié) 點(diǎn)頭位置的值,a42為表示節(jié)點(diǎn)A4的節(jié)點(diǎn)尾位置的值,a51為表示節(jié)點(diǎn)A5的節(jié)點(diǎn)頭的位置 的值,a52為表示節(jié)點(diǎn)A5的節(jié)點(diǎn)尾的位置的值;步驟501,判斷當(dāng)前元素A是否為根元素,如果是,當(dāng)前元素沒(méi)有相鄰元素,如果不 是,執(zhí)行步驟502 ;步驟502,查找當(dāng)前元素A的父元素,并根據(jù)預(yù)先約定的父元素的定位方法,定位 當(dāng)前元素的父元素的位置;具體的,在本發(fā)明中,預(yù)先約定的父元素的定位方法可以對(duì)任意元素查找當(dāng)前元 素的父元素,具體的方法為同上,設(shè)當(dāng)前元素為A = (A4,A5),A4 = (a41,a42),A5 = (a51,a52);502-1,判斷當(dāng)前元素A是否為根元素,如果是,則當(dāng)前元素沒(méi)有父元素,如果不 是,執(zhí)行步驟502-2 ;在本實(shí)施例中,判斷根元素的方法具體的可以為在對(duì)XML進(jìn)行解析時(shí),由報(bào)文起 始點(diǎn)開(kāi)始,查找第一個(gè)節(jié)點(diǎn),判斷第一個(gè)節(jié)點(diǎn)的類型,如果是報(bào)文頭,則繼續(xù)向后查找節(jié)點(diǎn) 并判斷節(jié)點(diǎn)類型,找到出現(xiàn)的第一個(gè)元素頭,則該元素頭為根元素的元素頭,根據(jù)該元素頭 定位根元素,并記錄,以此判斷當(dāng)前元素是否為根元素;502-2,根據(jù)預(yù)先約定的節(jié)點(diǎn)劃分方法,查找并劃分當(dāng)前元素A的元素頭的上一個(gè) 節(jié)點(diǎn),并設(shè)為A6;502-3,根據(jù)預(yù)先約定的節(jié)點(diǎn)類型判斷方法,判斷節(jié)點(diǎn)A6的類型,如果為元素頭, 執(zhí)行步驟502-4,如果不是元素頭,執(zhí)行步驟502-5 ;502-4,節(jié)點(diǎn)A6為當(dāng)前元素A的父元素的元素頭,根據(jù)預(yù)先約定的元素定位方法, 由節(jié)點(diǎn)A6定位得到當(dāng)前元素A的父元素P= (A6,A7),并且A6 = (a61,a62),A7 = (a71, a72),a61為元素頭A6的節(jié)點(diǎn)頭,a62為元素頭A6的節(jié)點(diǎn)尾,a71為元素尾A7的節(jié)點(diǎn)頭, a72為元素尾A7的節(jié)點(diǎn)尾;502-5,根據(jù)預(yù)先約定的節(jié)點(diǎn)劃分方法,查找并劃分節(jié)點(diǎn)A6的上一個(gè)節(jié)點(diǎn),并將所 述節(jié)點(diǎn)A6的上一個(gè)節(jié)點(diǎn)設(shè)為新的節(jié)點(diǎn)A6,返回步驟502-3。步驟503,根據(jù)所述預(yù)先約定的節(jié)點(diǎn)劃分方法,從當(dāng)前元素A的元素尾即a52向后 劃分得到下一個(gè)節(jié)點(diǎn),并設(shè)為節(jié)點(diǎn)A8,步驟504,判斷節(jié)點(diǎn)A8是否超出當(dāng)前元素A的父元素的范圍(即判斷A8是否超出 了當(dāng)前元素A的父元素P的元素尾a71)如果是,執(zhí)行步驟505;如果不是,執(zhí)行步驟506 ;步驟505,停止對(duì)當(dāng)前元素的相鄰元素的查找;步驟506,判斷節(jié)點(diǎn)A8的類型是否為元素頭,如果是元素頭,則A8為當(dāng)前元素A的 相鄰元素的元素頭,由節(jié)點(diǎn)A8定位當(dāng)前元素A的相鄰元素,否則,劃分得到節(jié)點(diǎn)A8的下一個(gè)節(jié)點(diǎn),并設(shè)為新的節(jié)點(diǎn)A8,返回步驟504。在本實(shí)施例中,步驟503和504,采取XML報(bào)文從上到下的,從左到右的解析方法, 還可以采取由當(dāng)前節(jié)點(diǎn)同時(shí)向兩邊的查找相鄰元素的方法,此時(shí),步驟503至506可以替換 為從當(dāng)前元素A的元素頭即a41向前逐個(gè)劃分節(jié)點(diǎn),并判斷所述從當(dāng)前元素的元素 頭向前劃分的節(jié)點(diǎn)類型,如果是元素尾,則為相鄰元素的元素尾,根據(jù)元素尾定位相鄰元 素,否則,繼續(xù)向前進(jìn)行節(jié)點(diǎn)的劃分,直到劃分到當(dāng)前元素A的父元素P的元素頭即a62之 后;并且,從當(dāng)前元素A的元素尾即a52開(kāi)始向后逐個(gè)劃分節(jié)點(diǎn),并判斷所述從當(dāng)前元素A 的元素頭向后劃分的節(jié)點(diǎn)類型,如果是元素頭,則為當(dāng)前元素的相鄰元素的元素頭,根據(jù)所 述元素頭定位相鄰元素,否則,繼續(xù)向后進(jìn)行節(jié)點(diǎn)的劃分,直到劃分到當(dāng)前元素A的父元素 P的元素尾即a71之前。實(shí)施例6基于實(shí)施例1-5所提供的一種對(duì)XML報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分的方法及基于上述節(jié) 點(diǎn)劃分方法的節(jié)點(diǎn)類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個(gè)子元素的方法、相 鄰元素的定位方法,本實(shí)施例提供了一種XML報(bào)文的解析方法,具體的如下步驟601,獲取XML報(bào)文的根元素,將所述根元素設(shè)為當(dāng)前元素;其中,獲取XML報(bào)文根元素的方法與實(shí)施例3中所述相同,這里不再贅述;步驟602,判斷當(dāng)前元素是否有子元素,如果有,執(zhí)行步驟603,如果沒(méi)有,執(zhí)行步 驟 605 ;步驟603,查找當(dāng)前元素的第一個(gè)子元素;在本步驟中,查找當(dāng)前元素的第一個(gè)子元素使用實(shí)施例4所提供的定位當(dāng)前元素 的第一個(gè)子元素的方法,這里不再贅述;步驟604,將步驟603中獲得的第一個(gè)子元素置為當(dāng)前元素,并返回步驟602 ;步驟605,判斷當(dāng)前元素之后是否有相鄰元素,如果有,執(zhí)行步驟606,如果沒(méi)有, 執(zhí)行步驟608 ;步驟606,定位并獲取當(dāng)前元素的相鄰元素;在本步驟中,定位并獲取當(dāng)前元素的相鄰元素使用實(shí)施例5所提供的相鄰元素的 定位方法,這里不再贅述;步驟607,將上述相鄰元素置為當(dāng)前元素,返回步驟602 ;步驟608,將當(dāng)前元素的父元素作為當(dāng)前元素,并判斷當(dāng)前元素是否為根元素,如 果是,執(zhí)行步驟609,如果不是,并返回步驟605 ;在本步驟中,查找當(dāng)前元素的父元素的方法與實(shí)施例5中查找當(dāng)前元素的父元素 的方法相同,這里不再贅述;步驟609,XML報(bào)文解析完成。在本實(shí)施例中,在對(duì)元素進(jìn)行定位的過(guò)程中,還包括對(duì)當(dāng)前元素的名稱的判斷,如 果解析器發(fā)現(xiàn)XML報(bào)文中所需的元素已經(jīng)完成解析并獲得得到了相應(yīng)元素的數(shù)據(jù),則停止 XML報(bào)文的解析,以節(jié)省內(nèi)存。本實(shí)施例所提供的一種XML報(bào)文的解析方法,無(wú)需在內(nèi)存中建立完整的節(jié)點(diǎn)樹(shù), 內(nèi)存使用小,適合內(nèi)存小的裝置進(jìn)行XML報(bào)文的解析,并且本實(shí)施例所提供的方法,適合C語(yǔ)言進(jìn)行實(shí)現(xiàn),因此可以支持嵌入式環(huán)境的應(yīng)用。在實(shí)施例1-6中,元素六、六1、六2、六3、六4、六5、六6、六7、六8、節(jié)點(diǎn)N、N1、N2、N3、N4、N5、 N6、N7、N8、N9以及各臨時(shí)節(jié)點(diǎn),都同當(dāng)前元素的表示方法,為不固定的指定為XML報(bào)文中某 個(gè)對(duì)象,而且根據(jù)XML上一步驟或本步驟中的指示而指代的對(duì)象,這在本領(lǐng)域技術(shù)人員中, 應(yīng)該是可以理解的。以上實(shí)施例分別一種對(duì)XML報(bào)文中的節(jié)點(diǎn)進(jìn)行劃分的方法及基于上述節(jié)點(diǎn)劃分 方法的節(jié)點(diǎn)類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個(gè)子元素的方法、相鄰元素 的定位方法、XML報(bào)文的解析方法進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原 理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思 想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式
及應(yīng)用范圍上 均會(huì)有改變之處,綜上,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。以上僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則 之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
一種XML報(bào)文中的節(jié)點(diǎn)劃分方法,其特征在于,所述方法包括步驟A1,獲取當(dāng)前位置和當(dāng)前位置的值;步驟A2,判斷當(dāng)前位置的值是否超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),如果當(dāng)前位置的值超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),返回錯(cuò)誤,否則,執(zhí)行步驟A3;步驟A3,判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A5,如果不是,執(zhí)行步驟A4;步驟A4,將當(dāng)前位置移動(dòng)一個(gè)單位,并將移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟A2;步驟A5,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)邊界,并將當(dāng)前位置移動(dòng)一個(gè)單位,將移動(dòng)一個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置;步驟A6,判斷當(dāng)前位置的值是否超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),如果當(dāng)前位置的值超過(guò)了所述XML報(bào)文的總長(zhǎng)度或者為負(fù)數(shù),返回錯(cuò)誤,否則,執(zhí)行步驟A7;步驟A7,判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將當(dāng)前位置按與步驟A5中當(dāng)前位置移動(dòng)方向相同的方向移動(dòng)一個(gè)單位,將移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置,返回執(zhí)行步驟A6;步驟A8,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的另一個(gè)節(jié)點(diǎn)邊界,得到當(dāng)前節(jié)點(diǎn),所述節(jié)點(diǎn)邊界包括節(jié)點(diǎn)頭和節(jié)點(diǎn)尾。
2.如權(quán)利要求1所述的方法,其特征在于,所述當(dāng)前位置的值為當(dāng)前位置的字符相對(duì) 于所述XML報(bào)文起始位置的偏移。
3.如權(quán)利要求2所述的方法,其特征在于,所述當(dāng)前節(jié)點(diǎn)使用一個(gè)二元組進(jìn)行表示,所 述二元組包括所述當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭和節(jié)點(diǎn)尾,在所述二元組中,使用所述當(dāng)前節(jié)點(diǎn)的節(jié) 點(diǎn)頭相對(duì)于所述XML報(bào)文中起始位置的偏移表示所述節(jié)點(diǎn)頭,使用所述當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾 相對(duì)于所述XML報(bào)文中起始位置的偏移表示所述節(jié)點(diǎn)尾。
4.如權(quán)利要求1所述的方法,其特征在于,步驟A4具體的包括將當(dāng)前位置向前移動(dòng)一個(gè)單位,并將所述向前移動(dòng)一個(gè)單位后得到的字符的位置作為 當(dāng)前位置,并將表示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A2 ; 或,將當(dāng)前位置向后移動(dòng)一個(gè)單位,并將所述向后移動(dòng)一個(gè)單位后得到的字符的位置作為 當(dāng)前位置,并將表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A2。
5.如權(quán)利要求1所述的方法,其特征在于,步驟A5具體的包括將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭,并將當(dāng)前位置向后移動(dòng)一個(gè)單位,將向后移動(dòng)一 個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞增1 ; 或,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,并將當(dāng)前位置向前移動(dòng)一個(gè)單位,將向前移動(dòng)一 個(gè)單位后得到的字符的位置設(shè)置為當(dāng)前位置,并將表示當(dāng)前位置的值遞減1。
6.如權(quán)利要求5所述的方法,其特征在于,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié) 點(diǎn)頭,并將當(dāng)前位置向后移動(dòng)一個(gè)單位時(shí),步驟A7具體的為判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將當(dāng)前 位置向后移動(dòng)一個(gè)單位,將向后移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置,并令表示當(dāng)前位置的值遞增1,返回執(zhí)行步驟A6。
7.如權(quán)利要求5所述的方法,其特征在于,當(dāng)步驟A5中,將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié) 點(diǎn)尾,并將當(dāng)前位置向前移動(dòng)一個(gè)單位時(shí),步驟A7具體的為判斷當(dāng)前位置對(duì)應(yīng)的字符是否為“<”或“>”,如果是,執(zhí)行步驟A8,如果不是,將當(dāng)前 位置向前移動(dòng)一個(gè)單位,將向前移動(dòng)一個(gè)單位后得到的字符的位置作為當(dāng)前位置,并令表 示當(dāng)前位置的值遞減1,返回執(zhí)行步驟A6。
8.如權(quán)利要求6所述的方法,其特征在于,步驟A8具體的為 將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)尾,得到當(dāng)前節(jié)點(diǎn)。
9.如權(quán)利要求7所述的方法,其特征在于,步驟A8具體的為 將當(dāng)前位置作為當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)頭,得到當(dāng)前節(jié)點(diǎn)。
10.如權(quán)利要求1所述的方法,其特征在于,所述將當(dāng)前位置移動(dòng)一個(gè)單位為由當(dāng)前字 符的位置移動(dòng)一個(gè)字符的距離。
11.基于權(quán)利要求1所述的一種XML報(bào)文中的節(jié)點(diǎn)劃分方法,一種XML報(bào)文中節(jié)點(diǎn)類型 判斷方法包括步驟Bi,判斷當(dāng)前節(jié)點(diǎn)是否為以“<”開(kāi)頭,以“>”結(jié)尾,如果是,執(zhí)行步驟B2,如果不 是,執(zhí)行步驟B7;步驟B2,判斷當(dāng)前節(jié)點(diǎn)中字符“<”之后的第一個(gè)位置對(duì)應(yīng)的字符,如果為“ ?”,執(zhí)行步 驟B3,如果為“ ! ”,執(zhí)行步驟B4,如果為“/,,,執(zhí)行步驟B5,否則,執(zhí)行步驟B6 ;步驟B3,判斷當(dāng)前節(jié)點(diǎn)中字符“>”之前的位置所對(duì)應(yīng)的字符是否為“? ”,如果是“ ?”, 判斷當(dāng)前節(jié)點(diǎn)中“<”之后的下一個(gè)位置的“? ”與“>”之前第一個(gè)位置的“? ”是否重合, 如果不重合,則記錄當(dāng)前節(jié)點(diǎn)為XML報(bào)文的頭,如果重合,返回錯(cuò)誤,如果不是“ ? ”,報(bào)文錯(cuò) 誤;步驟B4,記錄當(dāng)前節(jié)點(diǎn)為不需要解析的部分; 步驟B5,記錄當(dāng)前節(jié)點(diǎn)為元素尾;步驟B6,判斷當(dāng)前節(jié)點(diǎn)中字符“>”前的一個(gè)字符是否為“/”,如果是,則當(dāng)前節(jié)點(diǎn)為一 個(gè)完整的元素,否則,當(dāng)前節(jié)點(diǎn)為一個(gè)元素的元素頭;步驟B7,判斷當(dāng)前節(jié)點(diǎn)是否以“>”開(kāi)頭,以“<”結(jié)尾,如果是,則記錄當(dāng)前節(jié)點(diǎn)為元素 中間的值,如果不是,返回錯(cuò)誤,結(jié)束判斷節(jié)點(diǎn)類型。
12.基于權(quán)利要求1所述的一種XML報(bào)文中的節(jié)點(diǎn)劃分方法,一種XML報(bào)文中定位元素 的方法包括步驟Cl,判斷當(dāng)前節(jié)點(diǎn)的類型,如果是完整的元素,執(zhí)行步驟C2,如果是元素頭,執(zhí)行 步驟C3,如果是元素尾,執(zhí)行步驟C5,如果是元素中間的值,執(zhí)行步驟C7,如果是不需要解 析的部分,執(zhí)行步驟C8,如果是報(bào)文頭,返回錯(cuò)誤;步驟C2,記錄當(dāng)前節(jié)點(diǎn)所屬的元素即為所述步驟Cl中的完整的元素; 步驟C3,劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn); 步驟C4,判斷第一節(jié)點(diǎn)的節(jié)點(diǎn)類型如果是元素尾,判斷第一節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如果相 同,則當(dāng)前節(jié)點(diǎn)所屬的元素為以當(dāng)前節(jié)點(diǎn)尾元素頭、第一節(jié)點(diǎn)尾元素尾組成的元素,如果不 相同,則劃分得到第一節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn),返回重新執(zhí)行步驟C4;如果是元素頭,判斷第一節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如果相 同,則返回錯(cuò)誤,結(jié)束對(duì)所述XML報(bào)文的解析,如果不相同,劃分得到第一節(jié)點(diǎn)的下一個(gè)節(jié) 點(diǎn),并設(shè)為第一節(jié)點(diǎn),返回重新執(zhí)行步驟C4 ;如果是元素中間的值,劃分得到第一節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第一節(jié)點(diǎn),返回重新執(zhí) 行步驟C4 ;步驟C5,劃分得到當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn); 步驟C6,判斷第二節(jié)點(diǎn)的節(jié)點(diǎn)類型如果是元素頭,判斷第二節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如果相 同,則得到當(dāng)前節(jié)點(diǎn)所屬元素為以第二節(jié)點(diǎn)為元素頭、當(dāng)前節(jié)點(diǎn)為元素尾組成的元素,如果 不相同,劃分得到第二節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn),返回重新執(zhí)行步驟C6;如果是元素尾,判斷第二節(jié)點(diǎn)中的元素名稱與當(dāng)前節(jié)點(diǎn)的元素名稱是否相同,如果相 同,返回錯(cuò)誤,結(jié)束對(duì)所述XML報(bào)文的解析,如果不相同,則根據(jù)所述預(yù)先約定的節(jié)點(diǎn)劃分 方法,劃分得到第二節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn),返回重新執(zhí)行步驟C6;如果是元素中間的值,劃分得到第二節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第二節(jié)點(diǎn),返回重新執(zhí) 行步驟C6 ;步驟C7,劃分得到當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),設(shè)為第三節(jié)點(diǎn),劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè) 節(jié)點(diǎn),設(shè)為第四節(jié)點(diǎn),并判斷第三節(jié)點(diǎn)和第四節(jié)點(diǎn)的類型如果第三節(jié)點(diǎn)和第四節(jié)點(diǎn)都是元素頭,則第三節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)屬于同一個(gè)元素,根據(jù) 第三節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向后劃分得到第五節(jié)點(diǎn),則得到當(dāng)前節(jié)點(diǎn)所屬的元素為以第三節(jié)點(diǎn)為 元素頭、第五節(jié)點(diǎn)為元素尾的元素;如果第三節(jié)點(diǎn)和第四節(jié)點(diǎn)都是元素尾,則第四節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)屬于同一個(gè)元素,根據(jù) 第四節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向前劃分得到第六節(jié)點(diǎn),則得到當(dāng)前節(jié)點(diǎn)所屬的元素為以第六節(jié)點(diǎn)為 元素頭、第四節(jié)點(diǎn)為元素尾的元素;如果第三節(jié)點(diǎn)為元素頭、第四節(jié)點(diǎn)為元素尾,判斷第三節(jié)點(diǎn)中的元素名稱與第四節(jié)點(diǎn) 中的元素名稱是否相同,如果相同,則當(dāng)前節(jié)點(diǎn)所屬的元素為以第三節(jié)點(diǎn)為元素頭、第四節(jié) 點(diǎn)為元素尾組成的元素,如果不相同,返回錯(cuò)誤;如果第三節(jié)點(diǎn)為元素尾、第四節(jié)點(diǎn)為元素頭,返回錯(cuò)誤;步驟C8,劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為當(dāng)前節(jié)點(diǎn),判斷當(dāng)前節(jié)點(diǎn)是否為需要 解析的部分,如果是,返回步驟Cl,如果不是,重復(fù)執(zhí)行本步驟操作,直到當(dāng)前節(jié)點(diǎn)超出所述 XML報(bào)文的范圍。
13.如權(quán)利要求12所述的方法,其特征在于,所述根據(jù)第三節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向后劃分 得到第五節(jié)點(diǎn),具體的包括步驟C8_a,劃分得到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第五臨時(shí)節(jié)點(diǎn); 步驟C8-b,判斷第五臨時(shí)節(jié)點(diǎn)是否為元素尾,如果是,執(zhí)行步驟C8-c,如果不是,繼續(xù) 劃分得到第五臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第五臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟C8-b;步驟C8-c,判斷第五臨時(shí)節(jié)點(diǎn)中的元素名稱與第三節(jié)點(diǎn)中的元素名稱是否相同,如果 相同,則將第五臨時(shí)節(jié)點(diǎn)記錄為第五節(jié)點(diǎn),如果不相同,劃分得到第五臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié) 點(diǎn),并設(shè)為第五臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟C8-b。
14.如權(quán)利要求12所述的方法,其特征在于,所述根據(jù)第四節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)向前劃分得到第六節(jié)點(diǎn),具體的包括步驟C8_a’,劃分得到當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第六臨時(shí)節(jié)點(diǎn); 步驟C8-b’,判斷第六臨時(shí)節(jié)點(diǎn)是否為元素頭,如果是,執(zhí)行步驟C8-c’,如果不是,繼 續(xù)劃分得到第六臨時(shí)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第六臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟C8-b’ ; 步驟C8-c’,判斷第六臨時(shí)節(jié)點(diǎn)中的元素名稱與第四節(jié)點(diǎn)中的元素名稱是否相同,如果 相同,將第六臨時(shí)節(jié)點(diǎn)記錄為第六節(jié)點(diǎn),如果不相同,則執(zhí)行步驟劃分得到第六臨時(shí)節(jié)點(diǎn)的 上一個(gè)節(jié)點(diǎn),并設(shè)為第六臨時(shí)節(jié)點(diǎn),返回重新執(zhí)行步驟C8-b’。
15.基于權(quán)利要求1所述的一種XML報(bào)文中的節(jié)點(diǎn)劃分方法,一種XML報(bào)文中定位當(dāng)前 元素的第一個(gè)子元素的方法包括步驟D1,從當(dāng)前元素的元素頭的節(jié)點(diǎn)開(kāi)始,劃分得到當(dāng)前元素的元素頭的節(jié)點(diǎn)的下一 個(gè)節(jié)點(diǎn),并設(shè)為第七節(jié)點(diǎn);步驟D2,判斷第七節(jié)點(diǎn)的位置是否超出了當(dāng)前元素的元素尾,如果是,返回錯(cuò)誤,如果 不是,判斷第七節(jié)點(diǎn)的類型如果是元素頭,并且第七節(jié)點(diǎn)包含的元素名稱與當(dāng)前元素的元素名稱不同,則第七節(jié) 點(diǎn)為當(dāng)前元素的第一個(gè)子元素的元素頭,執(zhí)行步驟D3 ; 如果是元素尾,執(zhí)行步驟D4; 否則,執(zhí)行步驟D5;步驟D3,由第七節(jié)點(diǎn)定位得到當(dāng)前元素的第一個(gè)子元素;步驟D4,判斷第七節(jié)點(diǎn)與當(dāng)前元素的元素尾是否重合,如果是,則當(dāng)前元素沒(méi)有子元 素,如果不是,則返回錯(cuò)誤;步驟D5,劃分得到第七節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),并設(shè)為第七節(jié)點(diǎn),返回重新執(zhí)行步驟D2。
16.基于權(quán)利要求1所述的一種XML報(bào)文中的節(jié)點(diǎn)劃分方法,一種XML報(bào)文中相鄰元素 的定位方法,包括步驟E1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒(méi)有根元素,如果不是,執(zhí)行 步驟E2 ;步驟E2,根據(jù)預(yù)先約定的父元素定位方法,查找當(dāng)前元素的父元素,并定位當(dāng)前元素的 父元素的位置;步驟E3,根據(jù)所述預(yù)先約定的節(jié)點(diǎn)劃分方法,劃分得到當(dāng)前元素的元素尾的下一個(gè)節(jié) 點(diǎn),并設(shè)為第八節(jié)點(diǎn);步驟E4,判斷第八節(jié)點(diǎn)是否超出當(dāng)前元素的父元素的范圍 如果是,停止對(duì)當(dāng)前元素的相鄰元素的查找;如果不是,判斷第八節(jié)點(diǎn)的節(jié)點(diǎn)類型,如果是元素頭,則第八節(jié)點(diǎn)為當(dāng)前元素的相鄰元 素的元素頭,根據(jù)所述預(yù)先約定的元素定位方法,得到當(dāng)前元素的相鄰元素,否則,根據(jù)所 述預(yù)先約定的節(jié)點(diǎn)劃分方法,劃分得到第八節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),設(shè)為第八節(jié)點(diǎn),返回重新執(zhí) 行步驟E4。
17.如權(quán)利要求16所述的方法,其特征在于,所述預(yù)先約定的父元素定位方法,具體的 包括步驟E2-1,判斷當(dāng)前元素是否為根元素,如果是,則當(dāng)前元素沒(méi)有父元素,如果不是,執(zhí) 行步驟E2-2 ;步驟E2-2,劃分得到當(dāng)前元素的元素頭的上一個(gè)節(jié)點(diǎn),并設(shè)為第九節(jié)點(diǎn); 步驟E2-3,判斷第九節(jié)點(diǎn)的類型,如果是元素頭,執(zhí)行步驟E2-4,否則,執(zhí)行步驟E2-5 ; 步驟E2-4,第九節(jié)點(diǎn)為當(dāng)前元素的父元素的元素頭,根據(jù)所述預(yù)先約定的元素定位方 法,由第九節(jié)點(diǎn)定位得到當(dāng)前元素的父元素;步驟E2-5,劃分得到第九節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),并設(shè)為第九節(jié)點(diǎn),返回步驟E2-3。
18.基于權(quán)利要求1、11、12、15和16所述的方法,一種XML報(bào)文的解析方法,包括 步驟F1,獲取XML報(bào)文中的根元素,將所述根元素設(shè)為當(dāng)前元素; 步驟F2,判斷當(dāng)前元素是否有子元素,如果有,執(zhí)行步驟F3,如果沒(méi)有,執(zhí)行步驟F4 ; 步驟F3,查找當(dāng)前元素的第一個(gè)子元素,將所述第一個(gè)子元素設(shè)為當(dāng)前元素,返回步驟F2 ;步驟F4,判斷當(dāng)前元素之后是否有相鄰元素,如果有,執(zhí)行步驟F5,如果沒(méi)有,執(zhí)行步 驟F6 ;步驟F5,定位并獲取當(dāng)前元素的相鄰元素,將所述當(dāng)前元素的相鄰元素設(shè)為當(dāng)前元素, 返回步驟F2 ;步驟F6,將當(dāng)前元素的父元素設(shè)為當(dāng)前元素,并判斷當(dāng)前元素是否為根元素,如果是, 執(zhí)行步驟F7,如果不是,返回步驟F4 ; 步驟F7,所述XML報(bào)文解析完畢。
全文摘要
本發(fā)明提供了一種XML報(bào)文中節(jié)點(diǎn)的劃分方法,以及基于上述節(jié)點(diǎn)劃分方法的節(jié)點(diǎn)類型判斷方法、定位元素方法、定位當(dāng)前元素的第一個(gè)子元素的方法、相鄰元素的定位方法、XML報(bào)文的解析方法,本發(fā)明提供的解析方法適合使用C語(yǔ)言實(shí)現(xiàn),可以應(yīng)用于嵌入式環(huán)境中,并且不需要建立節(jié)點(diǎn)樹(shù),占用內(nèi)存小。
文檔編號(hào)G06F17/22GK101976244SQ20101050051
公開(kāi)日2011年2月16日 申請(qǐng)日期2010年9月30日 優(yōu)先權(quán)日2010年9月30日
發(fā)明者于華章, 陸舟 申請(qǐng)人:北京飛天誠(chéng)信科技有限公司