專利名稱:基于嵌入式平臺的xml報文解析方法
技術領域:
本發(fā)明涉及信息處理技術領域,具體涉及一種基于嵌入式平臺的XML報文的解析方法。
背景技術:
XML(The Extensible Markup Language,可擴展標識語言)是一種獨立于平臺的編程語言,由于它提供了擁有創(chuàng)建公共信息格式以及共享網(wǎng)絡上不同軟件應用的格式和數(shù)據(jù)的靈活機制,從而特別適于在Internet的分布式網(wǎng)絡上使用。XML是一種簡單的數(shù)據(jù)存儲語言,可以使用一系列簡單的標記描述數(shù)據(jù),而這些標記可以用方便的方式建立,XML的簡單使其易于在任何應用程序中讀寫數(shù)據(jù)。XML廣泛的應用于網(wǎng)絡及其相關技術,目前對XML報文進行解析的方法,普遍的為 XML DOMjXML DOM定義了訪問和處理XML報文的標準方法,XML DOM是XML Document Object Model的縮寫,即XML報文對象模型。當主機使用XML DOM所提供的方法進行XML報文的解析時,需要先將XML全部節(jié)點進行掃描,并在主機內(nèi)存中建立完整的節(jié)點樹,通過節(jié)點樹對XML報文中的符合條件的數(shù)據(jù)進行查找,這種方法占用主機的內(nèi)存資源過多,尤其是當對XML報文的解析在單片機中進行時,如智能卡中對XML報文的解析,智能卡由于體積的限制,本身的內(nèi)存資源較小,當使用XML DOM的方法對XML報文進行解析時,如果XML報文過大,則智能卡設備的內(nèi)存負擔過大。在對XML報文進行解析時,還可以采用面向?qū)ο缶幊痰姆椒?,使用面向?qū)ο笳Z言中提供的接口,通過編程實現(xiàn)XML解析器,使用解析器對XML報文進行解析,但是這種方法不適用于嵌入式環(huán)境,嵌入式環(huán)境不能支持面向?qū)ο蟮腦ML解析方法,但是由于嵌入式的廣泛應用,例如智能密鑰設備USB Key等,在嵌入式環(huán)境中對XML報文的解析是必不可少的。因此,尋求一種可以應用于嵌入式系統(tǒng)并且可以實現(xiàn)節(jié)省軟硬件資源的XML解析方法是本領域技術人員急需解決的問題。
發(fā)明內(nèi)容
本發(fā)明要解決的技術問題是,提供一種基于嵌入式平臺的XML報文解析方法,降低解析時嵌入式系統(tǒng)對軟硬件資源的要求。本發(fā)明解決上述技術問題采取的技術方案如下—種基于嵌入式平臺的XML報文解析方法,其特征是包括以下步驟,步驟101 初始化狀態(tài)機;所述初始化過程包括將當前指針指向待解析數(shù)據(jù)的第一個字符,將當前狀態(tài)置為起始狀態(tài),跳轉(zhuǎn)狀態(tài)置為空。步驟102 判斷當前指針是否指向待解析數(shù)據(jù)的末尾,是則解析結束,否則執(zhí)行下一步;具體為若當前指針指向字符‘\0’,則解析結束。步驟103 根據(jù)當前指針指向的字符和當前狀態(tài)計算出跳轉(zhuǎn)狀態(tài);步驟104 判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的條件,若符合則執(zhí)行下
7一步,否則報錯結束;步驟105 判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的提取規(guī)則,是則進行相應的操作再執(zhí)行下一步,否則直接執(zhí)行下一步;所述提取規(guī)則為,若待解析數(shù)據(jù)中的元素唯一,則當且僅當元素頭和元素尾一致時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在子元素,則當前僅當元素頭和元素尾一致、子元素頭和子元素尾一致時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在多個相鄰子元素,則當且僅當所有元素頭和元素尾一致時提取記錄的元素值。所述提取規(guī)則還可以為,若待解析數(shù)據(jù)中的元素唯一,則當且僅當元素頭和元素尾一致且元素頭和元素尾的元素名稱符合預先約定的元素名稱時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在子元素,則當且僅當元素頭和元素尾一致、子元素頭和子元素尾一致且元素頭和元素尾的元素名稱、子元素頭和子元素尾的元素名稱符合預先約定的元素名稱時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在多個相鄰子元素,則當且僅當所有元素頭和元素尾一致且所有元素頭和元素尾的元素名稱符合預先約定的元素名稱時提取記錄的元素值。所述執(zhí)行相應操作包括開始記錄、結束記錄和提取出記錄的數(shù)據(jù)。步驟106 將當前狀態(tài)更改為所述跳轉(zhuǎn)狀態(tài);步驟107 將當前指針指向下一個字符,返回執(zhí)行步驟102。上述步驟103具體為,先判斷得出當前狀態(tài),根據(jù)當前狀態(tài),優(yōu)先計算當前指針指向的字符為預設關鍵字符時對應的跳轉(zhuǎn)狀態(tài),再計算當前指針指向的字符是其他字符時對應的跳轉(zhuǎn)狀態(tài)。所述預設關鍵字符包括‘〈’、‘ !’、‘?’、‘/’和‘〉’。步驟103所述根據(jù)當前指針指向的字符和當前狀態(tài)計算出跳轉(zhuǎn)狀態(tài)具體包括以下步驟,步驟103-1 判斷當前狀態(tài)是否為起始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第一開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-2 判斷當前狀態(tài)是否為第一開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’、‘>’、‘!’、‘/’中的任意一個,是則報錯退出,否則,判斷當前指針指向的字符是否為‘? ’,是則跳轉(zhuǎn)狀態(tài)為報文頭開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-3 判斷當前狀態(tài)是否為報文頭開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’、‘>’、‘! ’、‘/’、‘?’中的任何一個,是則報錯退出,否則,跳轉(zhuǎn)狀態(tài)為報文頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-4 判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘? ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),否則,判斷當前指針指向的字符是否為‘! ’,是則跳轉(zhuǎn)狀態(tài)為注釋開始狀態(tài),否則,判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-5 判斷當前狀態(tài)是否為報文頭聲明狀態(tài),是則判斷當前指針指向的字符是否為'<’或‘〉’或‘! ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘?’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-6 判斷當前狀態(tài)是否為元素頭結束狀態(tài),是則判斷當前指針指向的字符是否為‘!’或‘〉’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第二開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài);否則執(zhí)行下一步;步驟103-7 判斷當前狀態(tài)是否為注釋開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘ ?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘! ’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-8 判斷當前狀態(tài)是否為準備結束狀態(tài),是則判斷當前指針指向的字符是否為‘! ’或‘〈’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-9 判斷當前狀態(tài)是否為第二開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘?’或‘! ’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-10 判斷當前狀態(tài)是否為元素值聲明狀態(tài),是則判斷當前指針指向的字符是否為‘!’或‘〉’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-11 判斷當前狀態(tài)是否為結束狀態(tài),是則判斷當前指針指向的字符是否為‘/’或‘〉’或‘?’或‘! ’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-12 判斷當前狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘?’或‘! ’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,報錯退出;否則執(zhí)行下一步;
步驟103-13 判斷當前狀態(tài)是否為元素尾聲明狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘! ’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-14 判斷當前狀態(tài)是否為第三開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘! ’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則報錯退出。上述步驟103-1至103-13的先后執(zhí)行順序可以互換。所述步驟103-8用步驟103-8,替換,所述步驟103-11用步驟103_11,替換,所述步驟103-12可用步驟103-12,替換如下步驟103-8’ 判斷當前狀態(tài)是否為準備結束狀態(tài),是則判斷當前指針指向的字符是否為‘>’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-11’ 判斷當前狀態(tài)是否為結束狀態(tài),是則判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-12’ 判斷當前狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,報錯退出;否則執(zhí)行下一步。上述步驟104具體包括如下步驟,步驟104-1 判斷跳轉(zhuǎn)狀態(tài)是否為第一開始狀態(tài),是則判斷當前狀態(tài)是否為起始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-2 判斷跳轉(zhuǎn)狀態(tài)是否為報文頭開始狀態(tài),是則判斷當前狀態(tài)是否為第一開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-3 判斷跳轉(zhuǎn)狀態(tài)是否為元素頭聲明狀態(tài),是則判斷當前狀態(tài)是否是第一開始狀態(tài)或元素頭結束狀態(tài)或結束狀態(tài)或元素頭聲明狀態(tài)或第二開始狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-4 判斷跳轉(zhuǎn)狀態(tài)是否為報文頭聲明狀態(tài),是則判斷當前狀態(tài)是否為報文頭開始狀態(tài)或報文頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;
否則執(zhí)行下一步;步驟104-5 判斷跳轉(zhuǎn)狀態(tài)是否為元素頭結束狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-6 判斷跳轉(zhuǎn)狀態(tài)是否為注釋開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-7 判斷跳轉(zhuǎn)狀態(tài)是否為準備結束狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-8 判斷跳轉(zhuǎn)狀態(tài)是否為第二開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-9 判斷跳轉(zhuǎn)狀態(tài)是否為元素值聲明狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-10 判斷跳轉(zhuǎn)狀態(tài)是否為結束狀態(tài),是則判斷當前狀態(tài)是否為準備結束狀態(tài)或元素尾聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-11 判斷跳轉(zhuǎn)狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-12 判斷跳轉(zhuǎn)狀態(tài)是否為元素尾聲明狀態(tài),是則判斷當前狀態(tài)是否為元素尾開始狀態(tài)或元素尾聲明狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-13 判斷跳轉(zhuǎn)狀態(tài)是否為第三開始狀態(tài),是則判斷當前狀態(tài)是否為元素尾聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則報錯退出。所述步驟104-1至104-12的先后執(zhí)行順序可以互換。本發(fā)明的有益效果是本發(fā)明提供的基于嵌入式平臺的XML報文解析方法,能在軟硬件資源較緊張的嵌入式設備中,較好地解析以XML為格式保存的信息。
圖1是一種基于嵌入式平臺的XML報文解析方法流程圖。
具體實施例方式為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚,下面將結合附圖對本發(fā)明實施方式做進一步地詳細描述。以下實施例中是以待解析數(shù)據(jù)為XML報文為例介紹的。為了便于說明,在本發(fā)明中對報文中的數(shù)據(jù)形式做如下定義將形如“〈Amount name = 〃金額“>1000. 5</Amount>” 的字符串定為為一個元素,完整的元素應包括元素頭、元素值、元素尾,在上述元素中,“〈Amount name="金額" >”為元素頭,1000. 5為元素值,“〈/Amount〉”為元素尾,在一個元素的元素尾中“</” 和“〉”之間的字符串為該元素的名稱,在上述元素中,“name ="金額“”為元素屬性,并且元素屬性只能存在于元素頭中;其中,元素可以進行嵌套,一個元素應該以“〈元素名稱”開頭,“</元素名稱〉”結尾,例如
<SignData>
<TradeType name=”行內(nèi)轉(zhuǎn)賬”〉inner Transfer〈/Trade Type〉 <SubType name="工資卡">salary card </SubType> <Timestamp>12345</Timestamp> </SignData>元素SignData中嵌套有元素TradeType、SubType、Timestamp,嵌套元素稱之為子元素,進一步的,子元素TradeType、SubType、Timestamp互稱為相鄰子元素。實施例1本實施例提供的一種利用狀態(tài)機解析數(shù)據(jù)的方法,可以快速從待解析數(shù)據(jù)中提取出重要內(nèi)容,如圖1所示,包括以下步驟步驟101:初始化;具體包括將當前指針指向待解析數(shù)據(jù)的第一個字符,將當前狀態(tài)置為起始狀態(tài), 跳轉(zhuǎn)狀態(tài)置為空。步驟102 判斷當前指針指向是否超出待解析數(shù)據(jù)的末尾,是則結束,否則執(zhí)行下
一步;本實施例中具體地,若當前指針指向字符‘\0’則解析結束。步驟103 根據(jù)當前指針指向的字符和當前狀態(tài)計算出跳轉(zhuǎn)狀態(tài);本實施例中優(yōu)選設置為,首先判斷當前狀態(tài),然后判斷當前狀態(tài)下當前指針指向的字符是否滿足預設關鍵字符,所述預設關鍵字符包括‘〈’、‘ !’、‘?’、‘/’和‘〉’,若滿足則執(zhí)行相應操作,否則再判斷當前指針指向的字符為其他字符時的情況。具體過程如下步驟103-1 判斷當前狀態(tài)是否為起始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第一開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-2 判斷當前狀態(tài)是否為第一開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’、‘>’、‘!’、‘/,中的任何一個,是則報錯退出,否則,判斷當前指針指向的字符是否為‘? ’,是則跳轉(zhuǎn)狀態(tài)為報文頭開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-3 判斷當前狀態(tài)是否為報文頭開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’、‘>’、‘! ’、‘/’、‘?’中的任何一個,是則報錯退出,否則,跳轉(zhuǎn)狀態(tài)為報文頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-4 判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘? ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),否則,判斷當前指針指向的字符是否為‘! ’,是則跳轉(zhuǎn)狀態(tài)為注釋開始狀態(tài),否則,判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;本步驟中具體的,所述準備結束狀態(tài)是指元素的準備結束狀態(tài)。步驟103-5 判斷當前狀態(tài)是否為報文頭聲明狀態(tài),是則判斷當前指針指向的字符是否為‘<,或‘〉’或‘! ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘?’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;本步驟中具體的,所述準備結束狀態(tài)是指報文頭的準備結束狀態(tài)。步驟103-6 判斷當前狀態(tài)是否為元素頭結束狀態(tài),是則判斷當前指針指向的字符是否為‘!’或‘〉’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第二開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài);否則執(zhí)行下一步;步驟103-7 判斷當前狀態(tài)是否為注釋開始狀態(tài),是則判斷當前指針指向的字符是否為‘<,或‘〉,或‘?,或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘! ’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;本步驟中所述準備結束狀態(tài)是指注釋的準備結束狀態(tài)。步驟103-8 判斷當前狀態(tài)是否為準備結束狀態(tài),是則判斷當前指針指向的字符是否為‘! ’或‘〈’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,報錯退出;否則執(zhí)行下一步;
步驟103-9 判斷當前狀態(tài)是否為第二開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘?’或‘! ’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-10 判斷當前狀態(tài)是否為元素值聲明狀態(tài),是則判斷當前指針指向的字符是否為‘!’或‘〉’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-11 判斷當前狀態(tài)是否為結束狀態(tài),是則判斷當前指針指向的字符是否為‘/’或‘〉’或‘?’或‘! ’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-12 判斷當前狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘?’或‘! ’,是則報錯退出,否則, 判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-13 判斷當前狀態(tài)是否為元素尾聲明狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘! ’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;本步驟中所述結束狀態(tài)具體是指元素的結束狀態(tài)。步驟103-14 判斷當前狀態(tài)是否為第三開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘! ’或‘?’或‘/’,是則報錯退出,否則, 判斷當前指針指向的字符為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則報錯退出。本實施例中具體地,根據(jù)判斷出的當前狀態(tài)的不同,當前指針指向預設關鍵字符時所執(zhí)行的操作也不同,例如,步驟103-5中當前指針指向'<’或‘〉’或‘ !’時報錯退出, 當前指針指向‘?’時得出跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),當前指針指向的字符為其他時得出跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài)。進一步地,上述步驟103-1至103-13的先后執(zhí)行順序可以互換,對步驟103計算得出的跳轉(zhuǎn)狀態(tài)不會產(chǎn)生影響,均在本發(fā)明保護范圍之內(nèi)。當未設定上述預設關鍵字符時,上述步驟103-8可以用步驟103-8’替換,上述步驟103-11可用步驟103-11,替換,上述步驟103-12可用步驟103-12’替換,具體如下步驟103-8’ 判斷當前狀態(tài)是否為準備結束狀態(tài),是則判斷當前指針指向的字符是否為‘>’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-11’ 判斷當前狀態(tài)是否為結束狀態(tài),是則判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-12’ 判斷當前狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟104 判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的條件,若符合則執(zhí)行下一步,否則報錯結束;本實施例中具體地,判斷是否符合預先預定的條件的過程優(yōu)選采用步驟步驟104-1 判斷跳轉(zhuǎn)狀態(tài)是否為第一開始狀態(tài),是則判斷當前狀態(tài)是否為起始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-2 判斷跳轉(zhuǎn)狀態(tài)是否為報文頭開始狀態(tài),是則判斷當前狀態(tài)是否為第一開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-3 判斷跳轉(zhuǎn)狀態(tài)是否為元素頭聲明狀態(tài),是則判斷當前狀態(tài)是否是第一開始狀態(tài)或元素頭結束狀態(tài)或結束狀態(tài)或元素頭聲明狀態(tài)或第二開始狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-4 判斷跳轉(zhuǎn)狀態(tài)是否為報文頭聲明狀態(tài),是則判斷當前狀態(tài)是否為報文頭開始狀態(tài)或報文頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-5 判斷跳轉(zhuǎn)狀態(tài)是否為元素頭結束狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-6 判斷跳轉(zhuǎn)狀態(tài)是否為注釋開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-7 判斷跳轉(zhuǎn)狀態(tài)是否為準備結束狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-8 判斷跳轉(zhuǎn)狀態(tài)是否為第二開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;
否則執(zhí)行下一步;步驟104-9 判斷跳轉(zhuǎn)狀態(tài)是否為元素值聲明狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-10 判斷跳轉(zhuǎn)狀態(tài)是否為結束狀態(tài),是則判斷當前狀態(tài)是否為準備結束狀態(tài)或元素尾聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-11 判斷跳轉(zhuǎn)狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-12 判斷跳轉(zhuǎn)狀態(tài)是否為元素尾聲明狀態(tài),是則判斷當前狀態(tài)是否為元素尾開始狀態(tài)或元素尾聲明狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-13 判斷跳轉(zhuǎn)狀態(tài)是否為第三開始狀態(tài),是則判斷當前狀態(tài)是否為元素尾聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則報錯退出。進一步的,上述步驟104-1至104-12的先后執(zhí)行順序可以互換,對步驟104所述判斷是否符合預先預定的條件的最終判斷結果不會產(chǎn)生影響,均在本發(fā)明的保護范圍之內(nèi)。步驟105 判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的提取規(guī)則,是則進行相應的操作再執(zhí)行下一步,否則直接執(zhí)行下一步;所述判斷是否符合預先約定的提取規(guī)則可以具體為判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的格式規(guī)則,是則進行相應的操作再執(zhí)行下一步,否則報錯;所述格式規(guī)則包括若待解析數(shù)據(jù)中的元素唯一,則當且僅當元素頭和元素尾一致時,格式正確,否則錯誤;若待解析數(shù)據(jù)中的元素存在子元素,則所有元素格式正確時,格式正確,否則錯誤。判斷格式正確的元素是否與預先約定的元素名稱一致,若一致則提取記錄的元素值,否則不提取直接執(zhí)行下一步。步驟106 將當前狀態(tài)更改為所述跳轉(zhuǎn)狀態(tài);步驟107 將當前指針指向待解析數(shù)據(jù)的下一個字符,返回執(zhí)行步驟102。實施例2以實施例1為基礎,當待解析數(shù)據(jù)中的元素唯一時,假設步驟105中所述預先約定的提取規(guī)則是當且僅當元素頭和元素尾一致時則提取該元素的元素值;則在解析過程中步驟105的具體操作包括
步驟105-1 當前狀態(tài)為第一開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-2 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為元素頭;進一步地,所述元素頭從第一個字符到第一個空格前的內(nèi)容即為元素頭中的元素名稱。如果沒有空格,則所述元素頭即為元素名稱。步驟105-2’ 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),結束記錄, 記錄下的數(shù)據(jù)為元素名稱;步驟105-3 當前狀態(tài)為元素頭結束狀態(tài),跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-4 當前狀態(tài)為元素值聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),結束記錄,記錄下的數(shù)據(jù)為元素值;步驟105-5 當前狀態(tài)為元素尾開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-6 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為元素尾;進一步地,元素尾除了第一個字符之外的部分即為元素名稱。步驟105-7 判斷步驟105-2(或步驟105_2’ )中記錄的元素名稱是否與步驟 105-6中記錄的一致,若一致則提取記錄下的數(shù)據(jù)中的元素值,否則報錯。優(yōu)選地,步驟105中所述預先約定的提取規(guī)則還可以是當且僅當元素頭和元素尾一致且元素頭與元素尾的元素名稱為預先約定的元素名稱時則提取該元素的元素值;具體為若步驟105-2(或步驟105-2’ )中記錄的元素名稱與步驟105-6中記錄的一致表示元素格式正確,則進一步判斷所述記錄的元素名稱是否與預先約定的元素名稱一致,若一致則提取元素值,否則不提取。例如,當待解析數(shù)據(jù)為<Timestamp>12345</Timestamp>時,則采用實施例1提供的方法進行解析時,執(zhí)行步驟105時具體會執(zhí)行到上述步驟105-1、105-2、105-3、105-4、 105-5、105-6、105-7,且最終提取到的數(shù)據(jù)為“ 12345” ;進一步的,若元素名稱“Timestamp” 與預先約定的元素名稱相符則提取數(shù)據(jù)“12345”,若不相符則不進行提取操作。當待解析數(shù)據(jù)為〈Timestamp/〉時,則采用實施例1提供的方法進行解析時,執(zhí)行步驟105時具體會執(zhí)行到上述步驟105-1和105-2,,則記錄下的數(shù)據(jù)為元素“Timestamp”,該元素為空元素,無提取數(shù)據(jù)。實施例3以實施例1為基礎,當待解析數(shù)據(jù)中的元素存在子元素時,假設步驟105中所述預先約定的提取規(guī)則是當前僅當元素頭和元素尾一致、子元素頭和子元素尾一致時則提取記錄的元素值;則在解析過程中步驟105的具體操作包括步驟105-1 當前狀態(tài)為第一開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-2 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為元素頭;
17
步驟105-3 當前狀態(tài)為元素頭結束狀態(tài),跳轉(zhuǎn)狀態(tài)為第二開始狀態(tài),不做任何記錄;步驟105-4 當前狀態(tài)為第二開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-5 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素頭;步驟105-6 當前狀態(tài)為元素頭結束狀態(tài),跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-7 當前狀態(tài)為元素值聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素值;步驟105-8 當前狀態(tài)為元素尾開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-9 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素尾;步驟105-10 當前狀態(tài)為結束狀態(tài),跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),不做任何記錄;步驟105-11 當前狀態(tài)為第三開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-12 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的上層元素的元素尾;步驟105-13 判斷當前記錄的元素頭和元素尾、子元素頭和子元素尾是否一致, 若一致則提取記錄下的數(shù)據(jù)中的元素值,否則報錯。優(yōu)選地,步驟105中所述預先約定的提取規(guī)則還可以是當且僅當元素頭和元素尾一致、子元素頭和子元素尾一致且且元素頭與元素尾的元素名稱以及子元素頭與子元素尾的元素名稱為預先約定的元素名稱時則提取該元素的元素值;具體為若當前記錄的元素頭和元素尾一致、子元素頭和子元素尾一致,則進一步判斷所述元素頭和元素尾的元素名稱、子元素頭和子元素尾的元素名稱是否與預先約定的元素名稱一致,若一致則執(zhí)行提取操作,提取記錄下的數(shù)據(jù)中的元素值,否則不提取。例如,以下待解析數(shù)據(jù)有元素嵌套,即Timestamp是SignData的子元素<SignData><Timestamp>12345</Timestamp></SignData>按照實施例1所述方法進行解析時,執(zhí)行步驟105時具體會執(zhí)行到上述步驟105-1 至105-13,且最終提取到的數(shù)據(jù)為“12345”。進一步的,若元素名稱“TimeStamp”、“SignData”均為預先約定的元素名稱則提取數(shù)據(jù)“12345”,若其中任意一個不符合預先約定的元素名稱則不進行提取操作。實施例4以實施例1為基礎,當待解析數(shù)據(jù)中的元素存在多個相鄰子元素,假設步驟105 中所述預先約定的提取規(guī)則是當且僅當所有元素頭和元素尾一致時則提取記錄到的元素值;則在解析過程中步驟105的具體操作包括
步驟105-1 當前狀態(tài)為第一開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-2 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為元素頭;步驟105-3 當前狀態(tài)為元素頭結束狀態(tài),跳轉(zhuǎn)狀態(tài)為第二開始狀態(tài),不做任何記錄;步驟105-4 當前狀態(tài)為第二開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-5 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素頭;步驟105-6 當前狀態(tài)為元素頭結束狀態(tài),跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-7 當前狀態(tài)為元素值聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素值;步驟105-8 當前狀態(tài)為元素尾開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-9 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素尾;步驟105-10 當前狀態(tài)為結束狀態(tài),跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),不做任何記錄;步驟105-11 當前狀態(tài)為第三開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-12 當前狀態(tài)為元素頭聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子相鄰子元素的元素頭;步驟105-13 當前狀態(tài)為元素頭結束狀態(tài),跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-14 當前狀態(tài)為元素值聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),結束記錄,記錄下的數(shù)據(jù)為相鄰子元素的元素值;步驟105-15 當前狀態(tài)為元素尾開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-16 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為相鄰子元素的元素尾;步驟105-17 當前狀態(tài)為結束狀態(tài),跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),不做任何記錄;步驟105-18 當前狀態(tài)為第三開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);步驟105-19 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的元素尾;步驟105-20 當前狀態(tài)為結束狀態(tài),跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),不做任何記錄;步驟105-21 當前狀態(tài)為第三開始狀態(tài),跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),從當前指針指向的字符開始記錄數(shù)據(jù);
步驟105-22 當前狀態(tài)為元素尾聲明狀態(tài),跳轉(zhuǎn)狀態(tài)為結束狀態(tài),結束記錄,記錄下的數(shù)據(jù)為子元素的上層元素的元素尾;步驟105-23 判斷當前記錄的元素頭和元素尾、子元素頭和子元素尾、相鄰子元素的元素頭和元素尾是否一致,若一致則提取記錄下的數(shù)據(jù)中的元素值,否則報錯。優(yōu)選地,步驟105中所述預先約定的提取規(guī)則還可以是當且僅當元素頭和元素尾一致、子元素頭和子元素尾一致、相鄰子元素的元素頭和元素尾一致且元素頭與元素尾的元素名稱、子元素頭與子元素尾的元素名稱以及相鄰子元素的元素頭和元素尾的元素名稱為預先約定的元素名稱時則提取該元素的元素值;具體為若當前記錄的元素頭和元素尾一致、子元素頭和子元素尾一致、相鄰子元素的元素頭和元素尾一致則表示元素格式正確,則進一步判斷所述元素頭和元素尾的元素名稱、子元素頭和子元素尾的元素名稱、相鄰子元素的元素頭和元素尾是否為預先約定的元素名稱,若是則執(zhí)行提取操作,提取記錄下的數(shù)據(jù)中的元素值,若任意一個元素名稱不符合預先約定的元素名稱則不提取。例如,以下待解析數(shù)據(jù)的元素SignData的存在相鄰的三個子元素TradeType、 SubType 禾口 Timestamp,按照實施例1所述方法進行解析時,執(zhí)行步驟105時具體會執(zhí)行到本實施例所述步驟105-1至105-23,且最終提取到的數(shù)據(jù)為“innerTransfer”、"salary card,,和 “12345”。
<SignData>
〈TradeType name=”行內(nèi)轉(zhuǎn)賬”〉inner Transfer〈/Trade Type〉 <SubType name="工資卡">salary card </SubType> <Timestamp>12345</Timestamp> </SignData>進一步,對于上述形式的待解析數(shù)據(jù),還設置步驟105中所述預先約定的提取規(guī)則中的提取記錄的元素值更改為提取記錄的元素屬性值和元素值。則對于上述例文,最終提取到的數(shù)據(jù)為“行內(nèi)轉(zhuǎn)賬innerTransfer,,、“工資卡salary card,,和“ 12345” ;進一步地,還可以設置當且僅當元素名稱“ SignData”、“TradeType,,、“ SubType,,、 “Timestamp”均為預先約定的元素名稱時則提取記錄下的數(shù)據(jù)中的元素值,若其中任意一個元素名稱不符合預先約定的元素名稱則不進行提取操作。以上所述的實施例只是本發(fā)明較優(yōu)選的具體實施方式
,本領域的技術人員在本發(fā)明技術方案范圍內(nèi)進行的通常變化和替換都應包含在本發(fā)明的保護范圍內(nèi)。
權利要求
1.一種基于嵌入式平臺的XML報文解析方法,其特征是包括以下步驟, 步驟101 初始化狀態(tài)機;步驟102 判斷當前指針是否指向待解析數(shù)據(jù)的末尾,是則解析結束,否則執(zhí)行下一止少;步驟103 根據(jù)當前指針指向的字符和當前狀態(tài)計算出跳轉(zhuǎn)狀態(tài); 步驟104 判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的條件,若符合則執(zhí)行下一步, 否則報錯結束;步驟105 判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的提取規(guī)則,是則進行相應的操作再執(zhí)行下一步,否則直接執(zhí)行下一步;步驟106 將當前狀態(tài)更改為所述跳轉(zhuǎn)狀態(tài);步驟107 將當前指針指向下一個字符,返回執(zhí)行步驟102。
2.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是步驟 101所述初始化過程包括將當前指針指向待解析數(shù)據(jù)的第一個字符,將當前狀態(tài)置為起始狀態(tài),跳轉(zhuǎn)狀態(tài)置為空。
3.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是所述步驟102中,若當前指針指向字符‘\0’,則解析結束。
4.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是步驟 103具體為,先判斷得出當前狀態(tài),根據(jù)當前狀態(tài),優(yōu)先計算當前指針指向的字符為預設關鍵字符時對應的跳轉(zhuǎn)狀態(tài),再計算當前指針指向的字符是其他字符時對應的跳轉(zhuǎn)狀態(tài)。
5.根據(jù)權利要求4所述的一種基于嵌入式平臺的XML報文解析方法,其特征是所述預設關鍵字符包括‘〈’、‘! ’、‘?’、‘/’和‘〉’。
6.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是步驟 103所述根據(jù)當前指針指向的字符和當前狀態(tài)計算出跳轉(zhuǎn)狀態(tài)具體包括以下步驟,步驟103-1 判斷當前狀態(tài)是否為起始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第一開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-2 判斷當前狀態(tài)是否為第一開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’、‘〉’、‘! ’、‘/’中的任意一個,是則報錯退出,否則,判斷當前指針指向的字符是否為‘ ?’,是則跳轉(zhuǎn)狀態(tài)為報文頭開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài); 否則執(zhí)行下一步;步驟103-3 判斷當前狀態(tài)是否為報文頭開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’、‘〉’、‘! ’、‘/’、‘?’中的任何一個,是則報錯退出,否則,跳轉(zhuǎn)狀態(tài)為報文頭聲明狀態(tài); 否則執(zhí)行下一步;步驟103-4 判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則判斷當前指針指向的字符是否為‘<’或‘ ?’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為元素頭結束狀態(tài),否則,判斷當前指針指向的字符是否為‘! ’,是則跳轉(zhuǎn)狀態(tài)為注釋開始狀態(tài),否則,判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài); 否則執(zhí)行下一步;步驟103-5 判斷當前狀態(tài)是否為報文頭聲明狀態(tài),是則判斷當前指針指向的字符是否為'<’或‘〉’或‘ !’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘? ’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-6 判斷當前狀態(tài)是否為元素頭結束狀態(tài),是則判斷當前指針指向的字符是否為‘!’或‘〉’或‘?’或‘/’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第二開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素值聲明狀態(tài);否則執(zhí)行下一步;步驟103-7 判斷當前狀態(tài)是否為注釋開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘ ?’或‘/’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘! ’,是則跳轉(zhuǎn)狀態(tài)為準備結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài); 否則執(zhí)行下一步;步驟103-8 判斷當前狀態(tài)是否為準備結束狀態(tài),是則判斷當前指針指向的字符是否為‘! ’或‘〈’或‘?’或‘/’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,報錯退出; 否則執(zhí)行下一步;步驟103-9 判斷當前狀態(tài)是否為第二開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘?’或‘! ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則執(zhí)行下一步;步驟103-10 判斷當前狀態(tài)是否為元素值聲明狀態(tài),是則判斷當前指針指向的字符是否為‘!’或‘〉’或‘ ?’或‘/’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為元素尾開始狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài); 否則執(zhí)行下一步;步驟103-11 判斷當前狀態(tài)是否為結束狀態(tài),是則判斷當前指針指向的字符是否為‘/’或‘〉’或‘?’或‘! ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),否則,報錯退出; 否則執(zhí)行下一步;步驟103-12 判斷當前狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘〉’或‘?’或‘! ’,是則報錯退出,否則,判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-13 判斷當前狀態(tài)是否為元素尾聲明狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘! ’或‘?’或‘/’,是則報錯退出,否則,判斷當前指針指向的字符為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為與當前狀態(tài)相同的狀態(tài);否則執(zhí)行下一步;步驟103-14 判斷當前狀態(tài)是否為第三開始狀態(tài),是則判斷當前指針指向的字符是否為‘〈’或‘! ’或‘ ?’或‘/’,是則報錯退出,否則,判斷當前指針指向的字符為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,跳轉(zhuǎn)狀態(tài)為元素頭聲明狀態(tài);否則報錯退出。
7.根據(jù)權利要求6所述的一種基于嵌入式平臺的XML報文解析方法,其特征是所述步驟103-1至103-13的先后執(zhí)行順序可以互換。
8.根據(jù)權利要求6所述的一種基于嵌入式平臺的XML報文解析方法,其特征是所述步驟103-8用步驟103-8,替換,所述步驟103-11用步驟103-11,替換,所述步驟103-12 可用步驟103-12’替換如下步驟103-8’ 判斷當前狀態(tài)是否為準備結束狀態(tài),是則判斷當前指針指向的字符是否為‘〉’,是則跳轉(zhuǎn)狀態(tài)為結束狀態(tài),否則,報錯退出; 否則執(zhí)行下一步;步驟103-11’ 判斷當前狀態(tài)是否為結束狀態(tài),是則判斷當前指針指向的字符是否為‘〈’,是則跳轉(zhuǎn)狀態(tài)為第三開始狀態(tài),否則,報錯退出;否則執(zhí)行下一步;步驟103-12’ 判斷當前狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前指針指向的字符是否為‘/’,是則跳轉(zhuǎn)狀態(tài)為元素尾聲明狀態(tài),否則,報錯退出;否則執(zhí)行下一步。
9.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是所述步驟104具體包括如下步驟,步驟104-1 判斷跳轉(zhuǎn)狀態(tài)是否為第一開始狀態(tài),是則判斷當前狀態(tài)是否為起始狀態(tài),是則執(zhí)行步驟105,否則報錯退出; 否則執(zhí)行下一步;步驟104-2 判斷跳轉(zhuǎn)狀態(tài)是否為報文頭開始狀態(tài),是則判斷當前狀態(tài)是否為第一開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出; 否則執(zhí)行下一步;步驟104-3 判斷跳轉(zhuǎn)狀態(tài)是否為元素頭聲明狀態(tài),是則判斷當前狀態(tài)是否是第一開始狀態(tài)或元素頭結束狀態(tài)或結束狀態(tài)或元素頭聲明狀態(tài)或第二開始狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出; 否則執(zhí)行下一步;步驟104-4 判斷跳轉(zhuǎn)狀態(tài)是否為報文頭聲明狀態(tài),是則判斷當前狀態(tài)是否為報文頭開始狀態(tài)或報文頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-5 判斷跳轉(zhuǎn)狀態(tài)是否為元素頭結束狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-6 判斷跳轉(zhuǎn)狀態(tài)是否為注釋開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-7 判斷跳轉(zhuǎn)狀態(tài)是否為準備結束狀態(tài),是則判斷當前狀態(tài)是否為元素頭聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-8 判斷跳轉(zhuǎn)狀態(tài)是否為第二開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-9 判斷跳轉(zhuǎn)狀態(tài)是否為元素值聲明狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-10 判斷跳轉(zhuǎn)狀態(tài)是否為結束狀態(tài),是則判斷當前狀態(tài)是否為準備結束狀態(tài)或元素尾聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則執(zhí)行下一步;步驟104-11 判斷跳轉(zhuǎn)狀態(tài)是否為元素尾開始狀態(tài),是則判斷當前狀態(tài)是否為元素頭結束狀態(tài)或元素值聲明狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出; 否則執(zhí)行下一步;步驟104-12 判斷跳轉(zhuǎn)狀態(tài)是否為元素尾聲明狀態(tài),是則判斷當前狀態(tài)是否為元素尾開始狀態(tài)或元素尾聲明狀態(tài)或第三開始狀態(tài),是則執(zhí)行步驟105,否則報錯退出; 否則執(zhí)行下一步;步驟104-13 判斷跳轉(zhuǎn)狀態(tài)是否為第三開始狀態(tài),是則判斷當前狀態(tài)是否為元素尾聲明狀態(tài),是則執(zhí)行步驟105,否則報錯退出;否則報錯退出。
10.根據(jù)權利要求9所述的一種基于嵌入式平臺的XML報文解析方法,其特征是所述步驟104-1至104-12的先后執(zhí)行順序可以互換。
11.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是步驟105所述提取規(guī)則為,若待解析數(shù)據(jù)中的元素唯一,則當且僅當元素頭和元素尾一致時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在子元素,則當且僅當元素頭和元素尾一致、子元素頭和子元素尾一致時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在多個相鄰子元素, 則當且僅當所有元素頭和元素尾一致時提取記錄的元素值。
12.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是步驟 105所述執(zhí)行相應操作包括開始記錄、結束記錄和提取出記錄的數(shù)據(jù)。
13.根據(jù)權利要求1所述的一種基于嵌入式平臺的XML報文解析方法,其特征是步驟 105所述提取規(guī)則為,若待解析數(shù)據(jù)中的元素唯一,則當且僅當元素頭和元素尾一致且元素頭和元素尾的元素名稱符合預先約定的元素名稱時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在子元素,則當且僅當元素頭和元素尾一致、子元素頭和子元素尾一致且元素頭和元素尾的元素名稱、子元素頭和子元素尾的元素名稱符合預先約定的元素名稱時提取記錄的元素值;若待解析數(shù)據(jù)中的元素存在多個相鄰子元素,則當且僅當所有元素頭和元素尾一致且所有元素頭和元素尾的元素名稱符合預先約定的元素名稱時提取記錄的元素值。
全文摘要
本發(fā)明提供了一種基于嵌入式平臺的XML報文的解析方法,屬于信息處理技術領域。所述方法包括,根據(jù)當前指針指向的字符和當前狀態(tài)計算跳轉(zhuǎn)狀態(tài),判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的條件,是則當前狀態(tài)更改為跳轉(zhuǎn)狀態(tài),否則報錯;進一步判斷當前狀態(tài)和跳轉(zhuǎn)狀態(tài)是否符合預先約定的格式規(guī)則,若不符合否則報錯,若符合則判斷當前元素是否符合預先約定的元素名稱,是則執(zhí)行相應提取操作,然后將當前狀態(tài)更改為跳轉(zhuǎn)狀態(tài),將當前指針指向下一個字符,否則不提取數(shù)據(jù)將當前狀態(tài)更改為跳轉(zhuǎn)狀態(tài),將當前指針指向下一個字符,重復上述操作直至當前指針指向報文尾解析結束。本發(fā)明能在軟硬件資源較緊張的嵌入式設備中,較好地解析以XML為格式保存的信息。
文檔編號G06F17/30GK102306191SQ20111025647
公開日2012年1月4日 申請日期2011年8月31日 優(yōu)先權日2011年8月31日
發(fā)明者于華章, 陸舟 申請人:飛天誠信科技股份有限公司