Xml數(shù)據(jù)解析方法、生成方法以及處理系統(tǒng)的制作方法
【專利摘要】本發(fā)明實(shí)施例提供了XML數(shù)據(jù)解析和生成方法,通過創(chuàng)建先進(jìn)后出的??臻g,來控制XML數(shù)據(jù)的解析和生成。在XML數(shù)據(jù)解析時,在開始符號出現(xiàn)時將標(biāo)識符入棧,并將對應(yīng)元素存儲到鏈表的數(shù)據(jù)單元上,在結(jié)束符號出現(xiàn)時將標(biāo)識符出棧。在XML數(shù)據(jù)生成時,在輸出元素的開始標(biāo)簽時標(biāo)識符入棧,在該元素所有的子元素都輸出后,標(biāo)識符出棧,輸出匹配的結(jié)束標(biāo)簽,以形成一個完成的元素。上述方法解析和生成方法提高了XML數(shù)據(jù)的處理效率。
【專利說明】
XML數(shù)據(jù)解析方法、生成方法以及處理系統(tǒng)
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉及到移動終端系統(tǒng),具體涉及一種避免移動終端的顯示屏MIPI干擾的方 法及裝置。
【背景技術(shù)】
[0002] 可擴(kuò)展標(biāo)記語言(XML)是用于表示數(shù)據(jù)的萬維網(wǎng)協(xié)會(W3C)標(biāo)準(zhǔn)。XML數(shù)據(jù)包含形 成層次的結(jié)構(gòu)化元素。許多應(yīng)用程序被設(shè)計成支持XML格式數(shù)據(jù)的輸入輸出。
[0003] 在XML中,稱為元素的數(shù)據(jù)項(xiàng)由開始標(biāo)簽和結(jié)束標(biāo)簽定界。元素還可包含在元素的 開始標(biāo)簽中規(guī)定的屬性。元素的標(biāo)簽之間的文本作為標(biāo)簽值,可表示諸如串、日期或整數(shù)的 任意類型的數(shù)據(jù)值。元素還可具有一個或更多個子元素和兄弟元素。除了根元素之外,每個 元素都具有父親元素。下面是一個XML格式數(shù)據(jù)的示例。
[0004]
[0005] 在上述示例中,根元素〈recipe〉包含子元素〈recipename>、〈preptime^IK 1 isti tem>,子元素〈1 istitem>包含子元素 〈quanti ty>、<i temdescription〉,其中〈 recipename〉、〈preptime〉和〈list item〉由于是并列關(guān)系,互為兄弟元素,根元素〈recipe〉 則為他們的父親元素。在構(gòu)造 XML數(shù)據(jù)時,為每個元素設(shè)計開始標(biāo)簽、結(jié)束標(biāo)簽、標(biāo)簽值,還 可以包含屬性字段,如子元素〈recipename〉具有的屬性字段name="Ice Cream Sundae"。 其中子元素也可以不包含標(biāo)簽值,如子元素〈recipename〉只包含屬性字段,通過/>作為結(jié) 束符號。
[0006] XML格式數(shù)據(jù)在表現(xiàn)具有層次結(jié)構(gòu)關(guān)系的數(shù)據(jù)項(xiàng)方面應(yīng)用廣泛,從而使處理XML數(shù) 據(jù)的應(yīng)用接口成為各類編程語言的必需。D0M(Document Object Model,對象文檔模型)是 W3C組織推薦的處理可擴(kuò)展置標(biāo)語言的標(biāo)準(zhǔn)編程接口。D0M可以以一種獨(dú)立于平臺和語言的 方式訪問和修改一個文檔的內(nèi)容和結(jié)構(gòu)。但對于大文件的XML數(shù)據(jù),使用D0M加載的速度并 不理想。另外D0M只提供封裝好的有限接口,不支持自定義的內(nèi)存池操作,也不能按照實(shí)際 需要定制生成特定格式的XML字符串或文檔。
【發(fā)明內(nèi)容】
[0007] 有鑒于此,本發(fā)明提供一種XML數(shù)據(jù)的解析和生成方法,以解決上述問題。
[0008] 根據(jù)本發(fā)明的一個方面,提供一種XML數(shù)據(jù)的解析方法,所述XML數(shù)據(jù)包含結(jié)構(gòu)化 的元素,包括:從XML數(shù)據(jù)中讀取一個或多個字符;針對每次讀取的所述字符,將所述字符和 預(yù)定義的字符進(jìn)行比對;如果確定所述字符為所述XML數(shù)據(jù)的第一元素的起始符號,將所述 第一元素存儲到數(shù)據(jù)鏈表的數(shù)據(jù)單元上,并將所述第一元素的標(biāo)識符存儲到棧空間,所述 ??臻g為預(yù)申請的預(yù)定大小的存儲單元;以及如果確定所述字符為第二元素的第一結(jié)束符 號,則將所述第二元素和所述棧空間的棧頂數(shù)據(jù)進(jìn)行比較,如果所述第二元素和所述棧頂 數(shù)據(jù)不匹配,則所述XML數(shù)據(jù)解析失敗,如果所述第二元素和所述棧頂數(shù)據(jù)匹配,則所述棧 頂數(shù)據(jù)出棧。
[0009] 優(yōu)選地,所述將所述第一元素存儲到數(shù)據(jù)鏈表的數(shù)據(jù)單元上包括:為所述第一元 素在所述數(shù)據(jù)鏈表上申請第一數(shù)據(jù)單元;獲取所述元素的標(biāo)簽、標(biāo)簽值以及結(jié)點(diǎn)類型;以及 將所述標(biāo)簽、標(biāo)簽值以及結(jié)點(diǎn)類型存儲到所述第一數(shù)據(jù)單元。
[0010] 優(yōu)選地,所述將所述第一元素存儲到數(shù)據(jù)鏈表的數(shù)據(jù)單元上還包括:確定所述第 一元素是否包含屬性字段;針對包含屬性字段的所述元素,每個屬性字段在所述數(shù)據(jù)鏈表 上申請第二數(shù)據(jù)單元,獲取所述屬性字段的屬性名稱和屬性值,并將所述屬性字段、屬性值 和結(jié)點(diǎn)類型存儲到所述第二數(shù)據(jù)單元。
[0011]優(yōu)選地,所述結(jié)點(diǎn)類型包括根結(jié)點(diǎn)、子結(jié)點(diǎn)和屬性結(jié)點(diǎn)。
[0012] 優(yōu)選地,還包括:針對包含屬性字段的所述第一元素,如果確定所述字符為第二結(jié) 束符號,將所述棧頂數(shù)據(jù)出棧。
[0013] 優(yōu)選地,所述將所述元素的標(biāo)識符存儲到??臻g包括:將所述標(biāo)簽或所述第一數(shù) 據(jù)單元的地址存儲到所述棧空間。
[0014] 優(yōu)選地,所述將所述第二元素和所述??臻g的棧頂數(shù)據(jù)進(jìn)行比較包括:從所述棧 空間彈出所述棧頂數(shù)據(jù);從所述棧頂數(shù)據(jù)中獲取元素標(biāo)簽;將所述元素標(biāo)簽和第二元素的 標(biāo)簽比較判斷是否一致。
[0015] 優(yōu)選地,還包括:所述從XML數(shù)據(jù)中讀取一個或多個字符之前,將所述XML數(shù)據(jù)讀取 到計算機(jī)內(nèi)存中。
[0016] 優(yōu)選地,還包括:在解析失敗或成功后,釋放所述??臻g。
[0017] 根據(jù)本發(fā)明的另一個方面,提供一種根據(jù)數(shù)據(jù)鏈表生成XML數(shù)據(jù)的方法,所述數(shù)據(jù) 鏈表的每個數(shù)據(jù)單元對應(yīng)所述XML數(shù)據(jù)的一個元素或?qū)傩宰侄?,包?讀取所述數(shù)據(jù)鏈表的 一個元素;針對每次讀取的的元素,將所述元素的標(biāo)識符存儲到??臻g,并按照第一格式輸 出所述元素的標(biāo)簽和標(biāo)簽值,所述棧空間為預(yù)申請的預(yù)定深度的??臻g;從??臻g讀取棧 數(shù)據(jù);針對每次讀取的棧數(shù)據(jù),在確定所述元素的所有子元素都輸出后,輸出所述元素的結(jié) 束標(biāo)簽,并將棧頂數(shù)據(jù)出棧。
[0018]優(yōu)選地,還包括:針對每次讀取的屬性字段,按照第二格式輸出所述屬性字段。 [0019]優(yōu)選地,所述按照第一格式輸出所述元素的標(biāo)簽和標(biāo)簽值包括:判斷所述元素是 否包括標(biāo)簽值;判斷所述元素是否包括子元素;以及根據(jù)是否包含標(biāo)簽值和子元素不同的 組合輸出所述元素的開始標(biāo)簽、標(biāo)簽值和結(jié)束標(biāo)簽。
[0020]優(yōu)選地,所述將所述元素的標(biāo)識符存儲到??臻g包括:將所述元素的標(biāo)簽或者所 述元素對應(yīng)的數(shù)據(jù)單元的地址存儲到所述棧空間。
[0021 ]優(yōu)選地,還包括:在解析失敗或成功后,釋放所述??臻g。
[0022]根據(jù)本發(fā)明的第三方面,提供一種XML數(shù)據(jù)處理系統(tǒng),包括:XML數(shù)據(jù)解析模塊,用 于從XML數(shù)據(jù)中獲取元素和屬性字段,并將所述元素和屬性字段分別存儲到數(shù)據(jù)鏈表的數(shù) 據(jù)單元上,其中,通過將所述元素的標(biāo)識符的入棧出??刂扑鲈氐慕馕?,在所述元素的 起始符號出現(xiàn)時,將所述標(biāo)識符入棧,在所述元素的結(jié)束符號出現(xiàn)時,將所述標(biāo)識符出棧;
[0023] XML數(shù)據(jù)生成模塊,用于將所述數(shù)據(jù)鏈表上的數(shù)據(jù)單元生成XML數(shù)據(jù)的元素或?qū)傩?字段,其中,通過所述數(shù)據(jù)單元的標(biāo)識符的入棧出??刂扑鲈氐妮敵?,在讀取每個根結(jié) 點(diǎn)或子結(jié)點(diǎn)的元素時,將所述數(shù)據(jù)單元的標(biāo)識符入棧,在確定所述元素的所有子元素都輸 出后,將所述數(shù)據(jù)單元的標(biāo)識符出棧。
[0024] 本發(fā)明實(shí)施例提供了XML數(shù)據(jù)解析和生成方法,通過創(chuàng)建先進(jìn)后出的棧空間,來控 制XML數(shù)據(jù)的解析和生成。在XML數(shù)據(jù)解析時,在開始符號出現(xiàn)時將標(biāo)識符入棧,并將對應(yīng)元 素存儲到鏈表的數(shù)據(jù)單元上,在結(jié)束符號出現(xiàn)時將標(biāo)識符出棧。在XML數(shù)據(jù)生成時,在輸出 元素的開始標(biāo)簽時標(biāo)識符入棧,在該元素所有的子元素都輸出后,標(biāo)識符出棧,輸出匹配的 結(jié)束標(biāo)簽,以形成一個完成的元素。上述方法解析和生成方法提高了 XML數(shù)據(jù)的處理效率。
【附圖說明】
[0025] 通過參照以下附圖對本發(fā)明實(shí)施例的描述,本發(fā)明的上述以及其它目的、特征和 優(yōu)點(diǎn)將更為清楚,在附圖中:
[0026] 圖1是本發(fā)明實(shí)施例的XML數(shù)據(jù)的解析方法的流程圖;
[0027] 圖2是本發(fā)明另一實(shí)施例的XML數(shù)據(jù)的解析方法的流程圖;
[0028] 圖3是本發(fā)明實(shí)施中的數(shù)據(jù)鏈表的示意圖;
[0029] 圖4是本發(fā)明實(shí)施中的??臻g的示意圖;
[0030] 圖5是本發(fā)明實(shí)施例的根據(jù)數(shù)據(jù)鏈表生成XML數(shù)據(jù)的方法的流程圖;
[0031] 圖6是本發(fā)明實(shí)施例的按照第一格式輸出所述元素的開始標(biāo)簽、標(biāo)簽值和結(jié)束標(biāo) 簽的流程圖;
[0032]圖7是本發(fā)明實(shí)施例的XML數(shù)據(jù)處理系統(tǒng)的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0033] 以下基于實(shí)施例對本發(fā)明進(jìn)行描述,但是本發(fā)明并不僅僅限于這些實(shí)施例。在下 文對本發(fā)明的細(xì)節(jié)描述中,詳盡描述了一些特定的細(xì)節(jié)部分。對本領(lǐng)域技術(shù)人員來說沒有 這些細(xì)節(jié)部分的描述也可以完全理解本發(fā)明。為了避免混淆本發(fā)明的實(shí)質(zhì),公知的方法、過 程、流程沒有詳細(xì)敘述。另外附圖不一定是按比例繪制的。
[0034] 在本發(fā)明的描述中,需要理解的是,術(shù)語"第一"、"第二"等僅用于描述目的,而不 能理解為指示或暗示相對重要性。
[0035]根據(jù)本發(fā)明實(shí)施例的一個方面,利用元素標(biāo)識符的棧進(jìn)棧出控制XML數(shù)據(jù)解析。在 XML數(shù)據(jù)中,父親元素的開始標(biāo)簽出現(xiàn)在兒子元素的開始標(biāo)簽之前,結(jié)束標(biāo)簽出現(xiàn)在兒子元 素的技術(shù)標(biāo)簽之后,如果通過??臻g存儲標(biāo)簽,在開始標(biāo)簽出現(xiàn)時存儲,在結(jié)束標(biāo)簽出現(xiàn)時 和棧頂?shù)拈_始標(biāo)簽比對,匹配的情況下說明XML格式正常,元素解析成功,可以接著解析下 一個元素,如果不匹配,說明XML格式錯誤,解析失敗。
[0036]圖1是本發(fā)明實(shí)施例的XML數(shù)據(jù)的解析方法的流程圖。如圖1所述的XML數(shù)據(jù)解析方 法包括步驟101 -步驟112。
[0037] 在步驟101中,申請預(yù)定深度的??臻g。在本步驟中,調(diào)用mem_alloc_cb_t函數(shù)申 請預(yù)定大小的存儲空間作為在本實(shí)施例中使用的??臻g。在使用??臻g時,遵循先進(jìn)后出 的原則,每次數(shù)據(jù)入棧時將數(shù)據(jù)推送到??臻g的棧頂,每次數(shù)據(jù)出棧時,棧頂數(shù)據(jù)先出棧。 [0038]在步驟102中,讀取XML數(shù)據(jù)的一個或多個字符。XML數(shù)據(jù)可以是保存到計算機(jī)內(nèi)存 中的XML字符串或XML文件。在一個優(yōu)選的實(shí)施例中,首先將XML文件加載到計算機(jī)內(nèi)存中, 在計算機(jī)內(nèi)存中讀取XML數(shù)據(jù)的字符。這樣做能提高XML數(shù)據(jù)的解析速度。
[0039] 在步驟103中,將字符和預(yù)定字符比對。在本步驟中,將步驟102中讀取的字符串和 〈XXX和〈/XXX字符串比對,其中XXX表示不定長度的大小寫的英文字符。
[0040] 在步驟104中,開始符號"〈XXX"。
[0041 ] 在步驟105中,結(jié)束符號"〈/XXX"。
[0042]在【背景技術(shù)】中提到,每個XML數(shù)據(jù)具有開始標(biāo)簽和結(jié)束標(biāo)簽作為一個元素的分界。 在步驟103-105中,通過和預(yù)定字符比較,判斷當(dāng)前字符是否為一個元素的開始標(biāo)簽〈XXX〉 或結(jié)束標(biāo)簽〈/XXX〉。
[0043]在步驟106中,解析該元素,將該元素存儲到鏈表的數(shù)據(jù)單元上。在本步驟中,繼續(xù) 讀取XML數(shù)據(jù),獲得該元素的相關(guān)數(shù)據(jù)并存儲到數(shù)據(jù)鏈表上。在一個優(yōu)選的實(shí)施例中,將元 素存儲到數(shù)據(jù)鏈表上包括:為元素在數(shù)據(jù)鏈表上申請一個數(shù)據(jù)單元;獲取元素的標(biāo)簽、標(biāo)簽 值以及結(jié)點(diǎn)類型;將標(biāo)簽和標(biāo)簽值以及數(shù)據(jù)類型存儲到數(shù)據(jù)單元。其中,結(jié)點(diǎn)類型定義為根 結(jié)點(diǎn)、子結(jié)點(diǎn)和屬性結(jié)點(diǎn)。
[0044] 在步驟107中,判斷??臻g為空。如果??臻g為空,說明105中的結(jié)束符號〈/XXX沒 有對應(yīng)的開始符號〈XXX,所以棧為空時,程序異常退出,即步驟111,在棧不為空時,執(zhí)行步 驟 109〇
[0045] 在步驟108中,將該元素的標(biāo)識符推送到??臻g。其中,元素的標(biāo)識符用來標(biāo)識一 個元素,推送到??臻g的標(biāo)識符用于在步驟109中進(jìn)行比對。該標(biāo)識符可以是一個元素的標(biāo) 簽或元素對應(yīng)的數(shù)據(jù)單元的地址。
[0046] 在步驟109中,取出棧頂數(shù)據(jù)的標(biāo)簽和當(dāng)前元素的比對,是否匹配。如前所述,棧空 間保存的是元素標(biāo)識符,可以是元素標(biāo)簽或者存儲元素數(shù)據(jù)單元的地址,如果存儲的是數(shù) 據(jù)單元地址,根據(jù)數(shù)據(jù)單元地址獲取元素的標(biāo)簽和當(dāng)前元素的標(biāo)簽比對,確定一致,執(zhí)行步 驟110,否則執(zhí)行步驟111。
[0047]在步驟110中,把棧頂數(shù)據(jù)從棧中彈出。表示一個元素已經(jīng)匹配成功,可以將該元 素的標(biāo)識符出棧。
[0048] 在步驟111中,異常退出。在本步驟中,釋放內(nèi)存資源,給出錯誤碼或錯誤信息,程 序結(jié)束。
[0049] 在步驟112中,數(shù)據(jù)讀取結(jié)束,釋放??臻g。XML數(shù)據(jù)讀取完畢,釋放資源,程序正常 結(jié)束。
[0050] 圖1所述的XML數(shù)據(jù)的解析方法,從XML數(shù)據(jù)中循環(huán)讀取字符,每次讀取的字符都判 斷是否是開始符號或結(jié)束符號,如果是開始符號,則解析元素,并將元素的標(biāo)識符存儲到棧 空間,如果是結(jié)束符號,則和棧頂?shù)臉?biāo)識符比對進(jìn)行判斷,確定匹配時,表明XML數(shù)據(jù)的一個 元素解析成功,可以解析下一個元素,否則提示數(shù)據(jù)格式錯誤,程序退出。
[0051] 圖2是本發(fā)明另一實(shí)施例的XML數(shù)據(jù)的解析方法的流程圖。圖2所述的實(shí)施例包括 圖1的步驟101-110,且增加了對具有屬性字段的元素的處理步驟201-204。由于附圖的篇幅 所限,在圖2上只示出了圖1的相關(guān)步驟101-108。
[0052] 相關(guān)步驟101-108和圖1的步驟相同,這里就不再贅述。
[0053]在步驟201中,判斷該元素是否存在屬性字段。在步驟104中,元素標(biāo)志"〈XXX",為 元素的起始符號,在本步驟中,進(jìn)一步判斷該元素是否具有屬性字段。如果具有屬性字段, 執(zhí)行步驟202,否則執(zhí)行步驟203。
[0054]在步驟202中,提取屬性字段的名稱和值,存儲到數(shù)據(jù)鏈表。
[0055]在步驟203中,判斷結(jié)束符號"/>"存在。如果存在,執(zhí)行步驟204,否則執(zhí)行步驟 106〇
[0056] 在步驟204中,將棧頂數(shù)據(jù)彈出。
[0057] 步驟201-步驟204處理屬性字段如〈recipename name= "Ice Cream Sundae"/〉, 從中提取屬性名"name"和屬性值"Ice Cream Sundae"并存儲到數(shù)據(jù)鏈表的一個數(shù)據(jù)單元 上。7>"符號是具有屬性字段的元素的結(jié)束符號,當(dāng)此符號出現(xiàn)時,表示當(dāng)前元素結(jié)束,因 此將該元素的標(biāo)識符從??臻g彈出。
[0058]上述解析方法中申請的??臻g在解析結(jié)束之后釋放,以免造成內(nèi)存泄漏。
[0059]在上述XML數(shù)據(jù)解析方法中,XML數(shù)據(jù)鏈表用以存儲結(jié)構(gòu)化的元素。圖3是給出了數(shù) 據(jù)鏈表存儲的示意圖框圖。如圖3所示,A1-A4,A21-A22,A211為數(shù)據(jù)鏈表上的一個數(shù)據(jù)單 元,每個數(shù)據(jù)單元對應(yīng)XML數(shù)據(jù)一個元素或?qū)傩?,A1-A2為兄弟元素,A21和A22為A2的子元 素,A22為A21的兄弟元素,A211為A21的子元素。
[0060]圖4是本發(fā)明實(shí)施中的??臻g的示意圖,存儲XML數(shù)據(jù)的元素標(biāo)簽。
[0061 ]在一個優(yōu)選的實(shí)施例中,數(shù)據(jù)鏈表上的每個數(shù)據(jù)單元的結(jié)構(gòu)定義如下:
[0062]
[0063]
[0064] 每個數(shù)據(jù)單元對應(yīng)一個元素,結(jié)點(diǎn)類型(type)表明該元素是屬性字段、根結(jié)點(diǎn)和 子結(jié)點(diǎn),兄弟結(jié)點(diǎn)(next)存儲第一個兄弟元素的地址,孩子結(jié)點(diǎn)頭(chiId)存儲第一個子元 素或第一個屬性元素的地址,和孩子結(jié)點(diǎn)尾(tail)存儲最后一個子元素或最后一個屬性元 素的地址。
[0065] 根據(jù)本發(fā)明實(shí)施例的另一個方面,通過鏈表生成XML字符串。利用元素標(biāo)簽或數(shù)據(jù) 單元的地址進(jìn)棧出??刂芚ML數(shù)據(jù)的生成。棧處理思路比D0M處理雖然更加復(fù)雜,但其擁有 更高的處理效率。
[0066] XML字符串格式包括1)有層次的XML數(shù)據(jù)和2)無層次的XML數(shù)據(jù)兩種:
[0067] 1)用回車換行符、空格字符、TAB字符等組織標(biāo)簽構(gòu)建XML樹
[0069] 2)無層次XML:不適用回車換行符、空格字符、TAB字符等組織標(biāo)簽構(gòu)建XML樹,如下 所示:
[0070] <ABCXDEF>asdasdljfasd</DEF><EFG><GDK>asdasd</GDK></EFGX/ABC>
[0071] 相應(yīng)的,根據(jù)本發(fā)明第二方面,根據(jù)數(shù)據(jù)鏈表生成XML字符串,即從數(shù)據(jù)鏈表中讀 取每個元素,按照一定格式輸出元素的開始標(biāo)簽和標(biāo)簽值,并將元素的標(biāo)識符(元素的標(biāo)簽 或數(shù)據(jù)單元地址)入棧,對于每個元素,在元素的所有子元素都輸出后,輸出元素的結(jié)束標(biāo) 簽,并將棧頂數(shù)據(jù)出棧。
[0072]圖5是本發(fā)明實(shí)施例的根據(jù)數(shù)據(jù)鏈表生成XML字符串(有層次)的方法的流程圖,包 括步驟501-518。
[0073] 在步驟501中,申請預(yù)定深度的??臻g。在本步驟中,調(diào)用mem_alloc_cb_t函數(shù)申 請預(yù)定大小的存儲空間作為在本實(shí)施例中使用的棧空間。在解析失敗或成功后,釋放所述 棧空間。
[0074]在步驟502中,讀取數(shù)據(jù)鏈表的一個元素。在本步驟中,順序讀取數(shù)據(jù)鏈表的每個 元素。
[0075]在步驟503中,元素入棧。在本步驟中,將元素的標(biāo)識符存儲到??臻g。
[0076] 在步驟504中,打印結(jié)點(diǎn)名〈name。
[0077] 在步驟505中,是否有屬性結(jié)點(diǎn)。判斷是否有屬性結(jié)點(diǎn),如果有屬性結(jié)點(diǎn),執(zhí)行步驟 506,如果沒有屬性結(jié)點(diǎn),執(zhí)行步驟508。
[0078]在步驟506中,讀取數(shù)據(jù)鏈表的屬性結(jié)點(diǎn)。
[0079] 在步驟507中,輸出屬性attr="value"。
[0080] 在步驟508中,根據(jù)標(biāo)簽值和子元素的組合判斷輸出標(biāo)簽和標(biāo)簽值。本步驟的一個 優(yōu)選流程如圖6所示,在步驟601-603中,判斷是否具有標(biāo)簽值和子元素,根據(jù)不同判斷的組 合,分別執(zhí)行步驟604-607步驟,按照一定格式打印標(biāo)簽和標(biāo)簽值。
[0081] 在步驟509中,判斷是否有子元素結(jié)束。如果有子元素結(jié)束,執(zhí)行步驟510,否則執(zhí) 行步驟502。
[0082]在步驟510中,彈出棧頂數(shù)據(jù)。
[0083] 在步驟511中,打印結(jié)束標(biāo)簽</name>\n。
[0084] 在步驟512中,判斷棧是否為空。如果棧為空,執(zhí)行步驟502,否則執(zhí)行步驟513。
[0085] 在步驟513中,判斷是否有兄弟元素。如果有兄弟元素,執(zhí)行步驟502,否則執(zhí)行步 驟 514。
[0086] 在步驟514中,父親元素出棧。
[0087] 在步驟515中,判斷是否有孩子結(jié)點(diǎn)。如果有孩子結(jié)點(diǎn),執(zhí)行步驟516,否則執(zhí)行步 驟 517。
[0088] 在步驟516中,打印結(jié)束標(biāo)簽</name>\n。
[0089] 在步驟517中,判斷棧是否為空,如果不為空,執(zhí)行步驟513,如果為空,執(zhí)行步驟 502〇
[0090] 在步驟518中,所有元素讀取,程序結(jié)束。
[0091] 根據(jù)本發(fā)明的第三方面,提供一種XML數(shù)據(jù)處理系統(tǒng),包括:
[0092] XML數(shù)據(jù)解析模塊701接收外部的XML數(shù)據(jù),從XML數(shù)據(jù)中獲取元素和屬性字段,并 將所述元素和屬性字段分別存儲到數(shù)據(jù)鏈表的一個數(shù)據(jù)單元上,其中,通過將所述元素的 標(biāo)識符的入棧出??刂扑鲈氐慕馕?,在所述元素的起始符號出現(xiàn)時,將所述標(biāo)識符入 棧,在所述元素的結(jié)束符號出現(xiàn)時,將所述標(biāo)識符出棧;
[0093] XML數(shù)據(jù)生成模塊702根據(jù)結(jié)點(diǎn)類型將所述數(shù)據(jù)鏈表上的數(shù)據(jù)單元生成XML數(shù)據(jù)的 元素或?qū)傩宰侄?,其中,通過所述數(shù)據(jù)單元的標(biāo)識符的入棧出??刂扑鲈氐慕馕?,針對 每個結(jié)點(diǎn)類型的元素,將所述數(shù)據(jù)單元的標(biāo)識符入棧,在確定所述元素的所有子元素都輸 出后,將所述數(shù)據(jù)單元的標(biāo)識符出棧。
[0094]本發(fā)明實(shí)施例提供了XML數(shù)據(jù)解析和生成方法,通過創(chuàng)建先進(jìn)后出的棧空間,來控 制XML數(shù)據(jù)的解析和生成。在XML數(shù)據(jù)解析時,在開始符號出現(xiàn)時將標(biāo)識符入棧,并將對應(yīng)元 素存儲到鏈表的數(shù)據(jù)單元上,在結(jié)束符號出現(xiàn)時將標(biāo)識符出棧。在XML數(shù)據(jù)生成時,在輸出 元素的開始標(biāo)簽時標(biāo)識符入棧,在該元素所有的子元素都輸出后,標(biāo)識符出棧,輸出匹配的 結(jié)束標(biāo)簽,以形成一個完成的元素。上述方法解析和生成方法提高了 XML數(shù)據(jù)的處理效率。
[0095] 本領(lǐng)域技術(shù)人員而言,顯然本發(fā)明不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背 離本發(fā)明的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本發(fā)明。例如,在實(shí)際應(yīng) 用中,可以不同的需要將上述模塊功能劃分為和本發(fā)明實(shí)施例不同的功能結(jié)構(gòu),或?qū)⒈景l(fā) 明實(shí)施例中的幾個功能模塊合并和分解成不同的功能結(jié)構(gòu)。因此,無論從哪一點(diǎn)來看,均應(yīng) 將實(shí)施例看作是示范性的,而且是非限制性的,本發(fā)明的范圍由所附權(quán)利要求而不是上述 說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本發(fā) 明內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然"包括"一 詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。系統(tǒng)權(quán)利要求中陳述的多個單元或裝置也可 以由一個單元或裝置通過軟件或者硬件來實(shí)現(xiàn)。
[0096] 以上所述僅為本發(fā)明的優(yōu)選實(shí)施例,并不用于限制本發(fā)明,對于本領(lǐng)域技術(shù)人員 而言,本發(fā)明可以有各種改動和變化。凡在本發(fā)明的精神和原理之內(nèi)所作的任何修改、等同 替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【主權(quán)項(xiàng)】
1. 一種XML數(shù)據(jù)的解析方法,所述XML數(shù)據(jù)包含結(jié)構(gòu)化的元素,其特征在于,包括: 從XML數(shù)據(jù)中讀取一個或多個字符; 針對每次讀取的所述字符,將所述字符和預(yù)定義的字符進(jìn)行比對; 如果確定所述字符為所述XML數(shù)據(jù)的第一元素的起始符號,將所述第一元素存儲到數(shù) 據(jù)鏈表的數(shù)據(jù)單元上,并將所述第一元素的標(biāo)識符存儲到??臻g,所述??臻g為預(yù)申請的 預(yù)定大小的存儲單元;以及 如果確定所述字符為第二元素的第一結(jié)束符號,則將所述第二元素和所述??臻g的棧 頂數(shù)據(jù)進(jìn)行比較,如果所述第二元素和所述棧頂數(shù)據(jù)不匹配,則所述XML數(shù)據(jù)解析失敗,如 果所述第二元素和所述棧頂數(shù)據(jù)匹配,則所述棧頂數(shù)據(jù)出棧。2. 根據(jù)權(quán)利要求1所述的解析方法,其特征在于,所述將所述第一元素存儲到數(shù)據(jù)鏈表 的數(shù)據(jù)單元上包括: 為所述第一元素在所述數(shù)據(jù)鏈表上申請第一數(shù)據(jù)單元; 獲取所述元素的標(biāo)簽、標(biāo)簽值以及結(jié)點(diǎn)類型;以及 將所述標(biāo)簽、標(biāo)簽值以及結(jié)點(diǎn)類型存儲到所述第一數(shù)據(jù)單元。3. 根據(jù)權(quán)利要求2所述的解析方法,其特征在于,所述將所述第一元素存儲到數(shù)據(jù)鏈表 的數(shù)據(jù)單元上還包括: 確定所述第一元素是否包含屬性字段; 針對包含屬性字段的所述元素,為每個屬性字段在所述數(shù)據(jù)鏈表上申請第二數(shù)據(jù)單 元,獲取所述屬性字段的屬性名稱和屬性值,并將所述屬性字段、屬性值和結(jié)點(diǎn)類型存儲到 所述第二數(shù)據(jù)單元。4. 根據(jù)權(quán)利要求2或3所述的解析方法,其特征在于,所述結(jié)點(diǎn)類型包括根結(jié)點(diǎn)、子結(jié)點(diǎn) 和屬性結(jié)點(diǎn)。5. 根據(jù)權(quán)利要求3所述的解析方法,其特征在于,還包括:針對包含屬性字段的所述第 一元素,如果確定所述字符為第二結(jié)束符號,將所述棧頂數(shù)據(jù)出棧。6. 根據(jù)權(quán)利要求2所述的解析方法,其特征在于,所述將所述元素的標(biāo)識符存儲到???間包括:將所述標(biāo)簽或所述第一數(shù)據(jù)單元的地址存儲到所述??臻g。7. 根據(jù)權(quán)利要求6所述的解析方法,其特征在于,所述將所述第二元素和所述棧空間的 棧頂數(shù)據(jù)進(jìn)行比較包括:從所述??臻g彈出所述棧頂數(shù)據(jù);從所述棧頂數(shù)據(jù)中獲取元素標(biāo) 簽;將所述元素標(biāo)簽和第二元素的標(biāo)簽比較判斷是否一致。8. 根據(jù)權(quán)利要求1所述的解析方法,其特征在于,還包括:所述從XML數(shù)據(jù)中讀取一個或 多個字符之前,將所述XML數(shù)據(jù)讀取到計算機(jī)內(nèi)存中。9. 根據(jù)權(quán)利要求1所述的解析辦法,其特征在于,還包括:在解析失敗或成功后,釋放所 述??臻g。10. -種根據(jù)數(shù)據(jù)鏈表生成XML數(shù)據(jù)的方法,其特征在于,所述數(shù)據(jù)鏈表的每個數(shù)據(jù)單 元對應(yīng)所述XML數(shù)據(jù)的一個元素或?qū)傩宰侄?,包括?讀取所述數(shù)據(jù)鏈表的一個元素; 針對每次讀取的的元素,將所述元素的標(biāo)識符存儲到棧空間,并按照第一格式輸出所 述元素的標(biāo)簽和標(biāo)簽值,所述??臻g為預(yù)申請的預(yù)定深度的??臻g; 從??臻g讀取棧數(shù)據(jù); 針對每次讀取的棧數(shù)據(jù),在確定所述元素的所有子元素都輸出后,輸出所述元素的結(jié) 束標(biāo)簽,并將棧頂數(shù)據(jù)出棧。11. 根據(jù)權(quán)利要求10所述的方法,其特征在于,還包括:針對每次讀取的屬性字段,按照 第二格式輸出所述屬性字段。12. 根據(jù)權(quán)利要求10所述的方法,其特征在于,所述按照第一格式輸出所述元素的標(biāo)簽 和標(biāo)簽值包括: 判斷所述元素是否包括標(biāo)簽值; 判斷所述元素是否包括子元素;以及 根據(jù)是否包含標(biāo)簽值和子元素不同的組合輸出所述元素的開始標(biāo)簽、標(biāo)簽值和結(jié)束標(biāo) 簽。13. 根據(jù)權(quán)利要求10所述的方法,其特征在于,所述將所述元素的標(biāo)識符存儲到??臻g 包括:將所述元素的標(biāo)簽或者所述元素對應(yīng)的數(shù)據(jù)單元的地址存儲到所述棧空間。14. 根據(jù)權(quán)利要求10所述的解析辦法,其特征在于,還包括:在解析失敗或成功后,釋放 所述??臻g。15. -種XML數(shù)據(jù)處理系統(tǒng),其特征在于,包括: XML數(shù)據(jù)解析模塊,用于從XML數(shù)據(jù)中獲取元素和屬性字段,并將所述元素和屬性字段 分別存儲到數(shù)據(jù)鏈表的數(shù)據(jù)單元上,其中,通過將所述元素的標(biāo)識符的入棧出??刂扑?元素的解析,在所述元素的起始符號出現(xiàn)時,將所述標(biāo)識符入棧,在所述元素的結(jié)束符號出 現(xiàn)時,將所述標(biāo)識符出棧; XML數(shù)據(jù)生成模塊,用于將所述數(shù)據(jù)鏈表上的數(shù)據(jù)單元生成XML數(shù)據(jù)的元素或?qū)傩宰?段,其中,通過所述數(shù)據(jù)單元的標(biāo)識符的入棧出??刂扑鲈氐妮敵?,在讀取每個根結(jié)點(diǎn) 或子結(jié)點(diǎn)的元素時,將所述數(shù)據(jù)單元的標(biāo)識符入棧,在確定所述元素的所有子元素都輸出 后,將所述數(shù)據(jù)單元的標(biāo)識符出棧。
【文檔編號】G06F17/30GK105868257SQ201511001504
【公開日】2016年8月17日
【申請日】2015年12月28日
【發(fā)明人】鄒奇峰
【申請人】樂視網(wǎng)信息技術(shù)(北京)股份有限公司