亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種基于標記的xml快速解碼方法

文檔序號:6519460閱讀:154來源:國知局
專利名稱:一種基于標記的xml快速解碼方法
技術(shù)領(lǐng)域
本發(fā)明涉及基于XML(eXtensible Markup Language)數(shù)據(jù)格式的信息解碼方法。
背景技術(shù)
XML(擴展標記語言)是一種置標語言,由于其具有開放性、可擴展性、語法嚴格、支持異構(gòu)網(wǎng)絡(luò)數(shù)據(jù)交換、安全性等強大優(yōu)勢,目前廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)通信、電子商務(wù)、圖書出版等關(guān)鍵性行業(yè)。在現(xiàn)代網(wǎng)絡(luò)通信中采用XML數(shù)據(jù)格式定義應(yīng)用層接口已經(jīng)成為趨勢,例如移動通信定位系統(tǒng)中定位客戶端和定位網(wǎng)關(guān)之間的接口協(xié)議MLP,為了實現(xiàn)諸如此類的通信設(shè)備,需要在內(nèi)部提供編解碼功能,即從網(wǎng)絡(luò)線路上的XML數(shù)據(jù)流到計算機內(nèi)部數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換。XML本身是一種結(jié)構(gòu)化的文本數(shù)據(jù)格式,主要由標記、標記值、屬性、屬性值、特殊處理指令等構(gòu)成。
目前針對XML數(shù)據(jù)解析技術(shù)有如下兩種方案一種是先直接采用現(xiàn)存的專門用于解析XML數(shù)據(jù)的支持包(例如JAVA語言中的javax.xml.parsers)來提取結(jié)構(gòu)和文本信息,然后通過編程語言(如C、C++等)定義樹型數(shù)據(jù)類型,對這些結(jié)構(gòu)和文本信息進行存放,最后根據(jù)得到的樹進行遍歷操作,從而轉(zhuǎn)換為最終的數(shù)據(jù)結(jié)構(gòu),并輸入到應(yīng)用程序中進行相關(guān)處理;另一種是不借助任何現(xiàn)有的支持包,完全自行實現(xiàn)對輸入的XML格式信息進行結(jié)構(gòu)和文本信息的提取,以后的步驟如同前面一種方案。
很顯然,由于以上兩種方案都離不開定義復(fù)雜的樹型數(shù)據(jù)結(jié)構(gòu),并且離不開執(zhí)行樹的構(gòu)造和遍歷操作,從而嚴重影響了系統(tǒng)性能。另外一個方面就是目前在通信系統(tǒng)的實現(xiàn)過程中,為了符合軟件工程思想,保證代碼的共用性和模塊化也是非常關(guān)鍵的。對于接口消息解碼思路是將消息分為兩個層次,即消息級和IE(信息元素)級,真正核心代碼實現(xiàn)位于IE級。這樣存在一個很大的缺陷,從軟件工程角度看就是可擴展性不夠好,例如對消息IE進行了更改或者增刪,就不得不去修改核心代碼。而且,核心解碼代碼與接口綁定在一起,使得這種核心代碼本身沒有任何的移植性。對于不同的接口,不得不去分別開發(fā)不同的核心解碼代碼,從而增加了系統(tǒng)開發(fā)成本。

發(fā)明內(nèi)容
根據(jù)上述背景技術(shù)中分析的缺陷和不足,本發(fā)明目的在于克服上述缺陷,提供了一種非常簡潔而高效的基于標記的XML快速解碼方法。
本發(fā)明的技術(shù)方案是一種基于標記的XML快速解碼方法,包括解析和解碼,其特征在于標記規(guī)則結(jié)構(gòu)信息通過段標記來體現(xiàn),內(nèi)容信息通過值標記來體現(xiàn);標記插入規(guī)則在每一段內(nèi),必須至少有一個值標記ValTag,而且至多只能有一個值標記ValTag;段定義和分段方法對于每個XML元素的值或?qū)傩愿髯苑譃橐欢?;如果元素沒有屬性和值就不分段;解碼規(guī)則嚴格按照段的順序執(zhí)行、不能跳躍;對于消息中必選的IE或者屬性,不執(zhí)行段內(nèi)搜索過程;對于消息中可選的IE或者屬性,必須執(zhí)行段內(nèi)搜索過程;解析步驟如下按照段和值標記插入規(guī)則解析成帶標記的平面的流,結(jié)構(gòu)信息通過段標記來體現(xiàn),內(nèi)容信息通過值標記來體現(xiàn);解碼步驟如下解析對帶有標記的平面的流①獲取當前段的長度;②在當前段內(nèi)檢查IE是否存在;③在當前段內(nèi)提取IE的值。
本發(fā)明的有益效果如下本發(fā)明采用了標記方法,并通過引入段的概念避免了樹型數(shù)據(jù)結(jié)構(gòu)的引入,同時也大大縮小了搜索范圍,從而大大增加了解碼速度。另外對消息解碼進行了更進一步的分層設(shè)計,在原來兩層的基礎(chǔ)上,進一步分為消息級、IE級和段級,使得和核心解碼代碼轉(zhuǎn)移到與IE本身沒有任何綁定關(guān)系的段級,從而使得核心解碼程序一旦開發(fā)出來,適用于任何基于XML的接口消息解碼實現(xiàn),無疑這將大大加快系統(tǒng)開發(fā)進度,減少了代碼開發(fā)量和開發(fā)成本。
在如下的具體實施方案里面,將詳細闡述本發(fā)明以上的四個主要方面。


圖1是本發(fā)明的基于XML消息解碼實現(xiàn)和測試總框架。
圖2是本發(fā)明的XML數(shù)據(jù)解析部分。
圖3是本發(fā)明的流數(shù)據(jù)解析部分。
圖4是本發(fā)明的XML數(shù)據(jù)解析流程圖。
圖5是本發(fā)明的帶標記流解碼的總體框架圖。
圖6是本發(fā)明的段解碼示意圖。
具體的實施方式(1).基于XML新的解碼思路以下結(jié)合附圖對本發(fā)明作進一步的詳細說明。注意為了突出本發(fā)明內(nèi)容,將忽略該領(lǐng)域技術(shù)人員熟悉的XML技術(shù)基礎(chǔ)知識、消息解碼所涉及的基本內(nèi)容,如網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換等。
參見附圖1,XML數(shù)據(jù)生成模塊11用于仿真生成原始數(shù)據(jù),是整個系統(tǒng)的輸入,該模塊主要用于系統(tǒng)的測試。解析模塊10是本發(fā)明的核心部分,包括兩個子系統(tǒng)101和102,參見附圖2和附圖3,分別用于對XML的解析并插入標記和對帶標記的流進行解碼。數(shù)據(jù)業(yè)務(wù)應(yīng)用模塊12作為整個系統(tǒng)測試的輸出,主要為了驗證整個設(shè)計方案的可行性,并提供性能測試。模塊101在執(zhí)行XML解析過程中,按照后面將介紹的段和值標記插入規(guī)則解析成帶標記的平面的流,結(jié)構(gòu)信息通過段標記來體現(xiàn),內(nèi)容信息通過值標記來體現(xiàn),這樣避免了引入復(fù)雜的數(shù)據(jù)接口來實現(xiàn)同樣的功能。在模塊102實現(xiàn)對帶標記流進行解碼過程中,僅僅需要設(shè)計非??焖俣啙嵉亩渭壓诵慕獯a代碼即可。
(2).標記及標記插入規(guī)則針對XML技術(shù)本身的特點,攜帶信息的標記本身具有一定的信息量,例如對于版本號就采用ver,對于經(jīng)緯對坐標就用X,Y,Z。而且因為通信接口消息的特點必選和可選IE在整個消息中出現(xiàn)的位置是隨機的,所以在解碼過程中需要采用一定的搜索算法。而為了加快執(zhí)行效率,必須約束搜索的范圍,以加快執(zhí)行的效率。否則搜索將在整個接收緩沖區(qū)里進行,顯然這是不必要的。另外,同樣的IE可能在不同的位置多次出現(xiàn),例如在消息頭和消息體中都有ver字段,這樣就更有必要對搜索的范圍加以約束。而通過本發(fā)明引入標記可以非常巧妙的解決了上述問題。
為了對XML數(shù)據(jù)做一般性分析,引入典型XML數(shù)據(jù)概念,即一個典型的XML數(shù)據(jù)必須能夠代表所有可能的XML消息結(jié)構(gòu)。具有如下特征一是XML數(shù)據(jù)必須是結(jié)構(gòu)良好的,即符合XML的嚴格語法規(guī)范;二是XML數(shù)據(jù)必須是合法的,即符合XML數(shù)據(jù)對應(yīng)DTD約束規(guī)范;
三是在保證前面兩條的前提下,必須包含XML數(shù)據(jù)組成成分元素、屬性、元素值與屬性值的所有可能組合。
由于接口消息和典型XML數(shù)據(jù)之間有如下對應(yīng)關(guān)系,所以分析典型XML數(shù)據(jù)也就是等價于分析了所有可能的接口消息結(jié)構(gòu)。
二者對應(yīng)表參見下表

表1接口消息和XML數(shù)據(jù)對應(yīng)表根據(jù)前面的定義,接口消息對應(yīng)的典型XML消息如下所示<?xml version=“1.0” encoding=“UTF-8”?><MSG><HDR>
<TAG1>t_val1</TAG1>
<TAG11 ATTR1=“11a_val1”>t_val11</TAG11>
<TAG12>t_val12</TAG12>
<TAG121>t_val121</TAG121>
<TAG2 ATTR1=“2a_val1”ATTR2=“2a_val2”>t_val2</TAG2>
<TAG3 ATTR1=“3a_val1”/>
<TAG4/></HDR><BODY>……</BODY><MSG>
從結(jié)構(gòu)上看,可以知道MSG是整個XML消息的根元素,下面有兩個一級子元素,分別是消息頭HDR和消息體BODY。HDR又有三個子元素,分別是TAG1,TAG2,TAG3和TAG4,其中TAG3和TAG4是空元素,即不帶內(nèi)容信息。而TAG1又具有兩個子元素TAG11和TAG12,TAG12有一個子元素TAG121。同樣,在子元素BODY里面,同樣有類似的迭代關(guān)系構(gòu)成整個結(jié)構(gòu)化的數(shù)據(jù)。
從信息內(nèi)容上看TAG1,TAG11,TAG12,TAG121,TAG2都攜帶了信息,分別是t_val1,t_val11,t_val12,t_val121,t_val2。另外TAG11和TAG2都帶有信息內(nèi)容(屬性值)分別是11a_val1,2a_val1,2a_val2和3a_val1。
正如前面所述,考慮到消息某些IE可選,所以除了提取XML數(shù)據(jù)的信息內(nèi)容,有必要保留必要的結(jié)構(gòu)信息。在這個原則下,引入兩個標記值標記(valTag)和段標記(segTag),分別用于反映輸入XML數(shù)據(jù)信息的內(nèi)容和結(jié)構(gòu)。選擇標記時遵從節(jié)約和小概率原則,節(jié)約指盡可能占用少的字節(jié)數(shù)目,因為每個消息平均估算40個左右,如果一個標記占用字節(jié)數(shù)目為n,那么平均每條消息將占用(40×n)個字節(jié),所以盡量讓n的值偏小。小概率原則是在確定了標記長度之后,選擇在消息內(nèi)容里面不太可能出現(xiàn)的字符作為標記。因為標記本身并不是原始信息內(nèi)容,它唯一的作用是用于輔助表達原始流里面的結(jié)構(gòu)信息。否則,必須針對原始信息內(nèi)容里出現(xiàn)了標記做出特殊的處理。
對于標記的定義和原則進行確定后,下面闡述標記插入規(guī)則,為了舉例說明,不防假設(shè)ValTag為“=”,SegTag為“|”。
對于值標記ValTag來說,插入的規(guī)則為只需要在每次遇到信息內(nèi)容之前插入一個,如“t_val1”就轉(zhuǎn)換為“=t_val1”,“t_val11”轉(zhuǎn)換為“=t_val11”,其他依此類推。
對于段標記SegTag來說,插入的規(guī)則為在每一段內(nèi),必須至少有一個值標記ValTag,而且至多只能有一個值標記ValTag。
因為一個結(jié)構(gòu)良好且合法的XML消息一定是由根元素通過父子迭代成為一顆樹型結(jié)構(gòu),這樣一個典型的XML消息,可以通過對元素的分析和分類來解析整個XML文檔。對于元素分類參見如下(2.1).元素沒有屬性,但具有值例如對于典型XML消息片斷<MSG><HDR><TAG1>t_val1</TAG1>來說,對于單獨的MSG或者HDR,不必要設(shè)計一個段,因為解碼的最終目的是提取內(nèi)容信息,而不是結(jié)構(gòu)信息。所以插入標記后的流為“|MSGHDRTAG1=t_val1|”。而不是“|MSG|HDR|TAG1=t_val1|”,因為如果這樣前面兩段里面將沒有值標記,即不含最終的內(nèi)容信息,這會導(dǎo)致段的浪費,并給以后的解碼帶來了一定的困難。
(2.2).元素具有屬性,又具有值例如對于典型XML消息片斷<TAG1>t_val1</TAG1>
<TAG11 ATTR1=“11a_val1”>t_val11</TAG11>
插入標記后為“|TAG1=t_val1|TAG11ATTR1=11 a_val1|=t_val11|”。如上XML數(shù)據(jù)片斷包含三個信息內(nèi)容,分別是t_val1,11a_val1和t_val11,由此可以看出段的數(shù)目與值的個數(shù)是一致的。對于一個元素具有多個屬性的情況,根據(jù)前面的段標記插入規(guī)則將為每個屬性產(chǎn)生一個單獨的段。
(2.3).元素具有屬性,沒有值這種情況主要是空元素,例如對于典型XML消息片斷<TAG3 ATTR1=“3a_val1”/>
插入標記后為“|TAG3ATTR1=3a_val1|”(2.4).元素沒有屬性,沒有值這種情況同樣是針對空元素,例如對于典型XML消息片斷<TAG4/>
由于不能提取任何信息內(nèi)容,所以不會對此生成單獨的段,即空元素將被忽略。綜合以上四種情況,不難得到整個典型的XML消息的經(jīng)過標記插入以后,得到的帶標記的流為“|MSGHDRTAG1=t_val1|TAG11ATTR1=11a_val|=t_val11|TAG12=t_val12|TAG121=t_val121|TAG2ATTR1=2a_val1|ATTR2=2a_val2|=t_val2|TAG3ATTR1=3a_val1|”。
(3).對XML數(shù)據(jù)的解析根據(jù)(2)中對標記和標記插入規(guī)則的分析,以及需要得到的帶標記的流,并充分利用XML消息本身具有迭代的特點,即站在任何一個層次的元素節(jié)點上面,總可以找到一個通用的算法,可以向上(父節(jié)點方向)或者向下(子節(jié)點方向)進行遞歸,從而遍歷到整個的XML文檔。對于解碼來說,顯然采用向下策略要簡便。由此可見,對于XML的解析核心部分就是迭代算法的設(shè)計。參見附圖4所示的XML解析流程圖(迭代算法),下面予以詳細的說明首先通過塊401計算當前節(jié)點的類型,經(jīng)過402的判斷如果為根元素,那么不可能有屬性值,也不可能是最內(nèi)層的元素節(jié)點,所以不執(zhí)行流構(gòu)造操作,而是如塊403所示返回執(zhí)行迭代解析函數(shù)本身。
如果當前節(jié)點的類型為一般的元素節(jié)點,則按照塊404提取該節(jié)點,并按照405所示,開始構(gòu)造輸出流。
接著如塊406所示獲取當前節(jié)點的屬性列表,并通過塊407的判斷是否具有屬性。如果有屬性,那么根據(jù)408所示,執(zhí)行循環(huán)操作,每次操作構(gòu)造一個屬性段,構(gòu)造的段內(nèi)容如409所示分別為屬性名稱,值標記,屬性值和段標記。注意構(gòu)造輸出流是采用追加的方式,即對于每個節(jié)點,段的開始總是從塊405開始構(gòu)造,然后進行追加。所謂追加就是指從前往后按照順序存放,不留空隙也不重疊。由于是迭代的方式,那么整個XML文檔的流輸出也一致的采用了追加的方式。如果407判斷當前節(jié)點沒有屬性,或者408循環(huán)操作完畢,那么開始如塊410所示計算節(jié)點的子節(jié)點,并通過411判斷當前節(jié)點是否為最內(nèi)層節(jié)點,即是否還具有子節(jié)點。如果是,那么就構(gòu)造信息內(nèi)容段,構(gòu)造方式如塊415所示分別是值標記、信息內(nèi)容和段標記。如果411判斷當前節(jié)點不是最內(nèi)層的節(jié)點,那么還不能構(gòu)造段,而是按照403所示調(diào)用迭代的解析函數(shù)本身。
(4).對帶標記流的解碼整個解碼系統(tǒng)的目標是生成最后的數(shù)據(jù)結(jié)構(gòu),考慮到接口消息的特點如下一是所有消息共用一個消息頭,對于不同消息只是某些IE取值不同;二是所有消息都共用大量的IE。
根據(jù)這兩個的特征,并根據(jù)軟件工程對代碼最大重用性的原則,設(shè)計如附圖5所示的總體解碼框架示意圖,總體解碼思路就算消息頭和消息體分離;消息體實行分級策略分為消息級、IE級和段級。從附圖5可以看出,IE級相當是對消息的分解,所以其總的模塊數(shù)目大概是消息數(shù)量的4到5倍,而段級又起到了收斂的作用,這樣整個解碼的核心部分實際就是如下三個功能性的模塊一是獲取當前段的長度;二是在當前段內(nèi)檢查IE是否存在;三是在當前段內(nèi)提取IE的值。
其它級(消息和IE級)只是一種程序的框架而已,這使得程序設(shè)計非常簡便,而且非常容易維護和具有良好的擴展性,無論以后增加多少個消息或者IE,都只需要如上的三個段級功能模塊。
為了說明的方便性,將(3)里面典型的XML數(shù)據(jù)最終輸出的帶標記的流作如下等價變換,得到附圖6所示的內(nèi)容一是將TAG全部等價寫成IE,因為MLP協(xié)議里面的IE名稱就對應(yīng)于XML文檔的標簽;二是將段標記用一條長的豎線代替。
為了便于說明,現(xiàn)在以附圖6來闡述段解碼過程。消息開始的三個IE分別是IE1,IE11和IE12,其中IE1和IE11是必選,IE12是可選。而IE11具有一個可選的屬性ATTR1。
首先段1對應(yīng)必選的IE1,直接取出t_val1即可。緊接者,解析段2,由于已經(jīng)知道段1(IE1)之后就是下一個IE11,并且該IE具有一個可選的屬性,此時需要判斷是否存在,然后才能提取里面的值。這里僅僅通過在段2的范圍內(nèi)部做個搜索即可。如果存在ATTR,那么提取值賦值給數(shù)據(jù)結(jié)構(gòu)對應(yīng)的變量,而下一段仍然是IE11的內(nèi)容,同樣提取里面的值即可。相反,如果在IE11段內(nèi)沒有找到ATTR,那么說明可選的屬性為空缺,該段的值就是IE11的取值。這樣就對必選的IE11解碼完畢。接著開始解碼IE12,由于該IE是可選的,所以同樣要在該段內(nèi)執(zhí)行搜索,以判斷該IE是否存在。依此類推,當整個消息IE對應(yīng)的段全部解碼完畢,整個消息也就解碼完畢。
基于上一段的詳細描述,得到對帶標記流的解碼需要遵從如下規(guī)則一是對于輸入流來說,必須按照嚴格的順序逐段解碼,不能跳躍。
二是對于必選IE或者屬性,為了提高解碼效率,不需要執(zhí)行段內(nèi)搜索。
三是對于可選IE或者屬性,必須執(zhí)行段內(nèi)搜索,從而決定是否存在解碼的對象。
這樣,對于任何段的解碼,從程序設(shè)計的角度來看,結(jié)合上面的解碼規(guī)則,只需要實現(xiàn)前天提到的三個段級的功能模塊即可,闡述如下(4.1).獲取段的長度這已經(jīng)簡單到在一個字符串里面去如何快速搜索到段標記segTag。采用優(yōu)化的庫函數(shù),當然為了避免在整個接收緩沖區(qū)中搜索,不妨約定最大的搜索范圍,如何越界就視為失敗。在本發(fā)明中,采用了監(jiān)哨所策略,這樣避免在循環(huán)中每次去檢測是否達到搜索邊界,從而在一定程度上加快了搜索速度。
(4.2).在當前段內(nèi)檢查IE是否存在這也是在段內(nèi)執(zhí)行子字符串搜索,同樣使用經(jīng)過優(yōu)化的庫函數(shù)。
(4.3).在當前段內(nèi)提取IE的值只需要在當前段內(nèi),將值標記和下一個段標記之間的串取出即可。
經(jīng)過如上闡述,可以看出對段的解碼已經(jīng)簡化到對字段串的基本操作,由于這三個模塊是整個解碼的核心,需要被頻繁調(diào)用,所以本發(fā)明采用了優(yōu)化的庫函數(shù)和自行實現(xiàn)相結(jié)合的策略,從而達到了系統(tǒng)設(shè)計目的。
權(quán)利要求
1.一種基于標記的XML快速解碼方法,包括解析和解碼,其特征在于標記規(guī)則結(jié)構(gòu)信息通過段標記來體現(xiàn),內(nèi)容信息通過值標記來體現(xiàn);標記插入規(guī)則在每一段內(nèi),必須至少有一個值標記ValTag,而且至多只能有一個值標記ValTag;段定義和分段方法對于每個XML元素的值或?qū)傩愿髯苑譃橐欢?;如果元素沒有屬性和值就不分段;解碼規(guī)則嚴格按照段的順序執(zhí)行、不能跳躍;對于消息中必選的IE或者屬性,不執(zhí)行段內(nèi)搜索過程;對于消息中可選的IE或者屬性,必須執(zhí)行段內(nèi)搜索過程;解析步驟如下按照段和值標記插入規(guī)則解析成帶標記的平面的流,結(jié)構(gòu)信息通過段標記來體現(xiàn),內(nèi)容信息通過值標記來體現(xiàn);解碼步驟如下解析對帶有標記的平面的流①獲取當前段的長度;②在當前段內(nèi)檢查IE是否存在;③在當前段內(nèi)提取IE的值。
全文摘要
本發(fā)明提出了一種基于標記的XML快速解碼方法,通過定義典型XML數(shù)據(jù)模型,引入段標記和值標記以最小的代價分別描述了XML數(shù)據(jù)文檔的結(jié)構(gòu)和內(nèi)容信息,并提出了標記選擇規(guī)則和標記插入規(guī)則,從而避免定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu),大大加快了解碼效率。同時為了解碼模塊的高度可移植性,在現(xiàn)在廣泛應(yīng)用的二級分層(消息和IE級)基礎(chǔ)上,創(chuàng)造性的提出了三級分層(消息、IE和段級)模型,從而可以明顯增加解碼核心模塊的共用性和可擴展性,從而大大節(jié)省了系統(tǒng)開發(fā)成本。
文檔編號G06F17/30GK1667610SQ20051001842
公開日2005年9月14日 申請日期2005年3月24日 優(yōu)先權(quán)日2005年3月24日
發(fā)明者廖祥龍, 鄭亮 申請人:北京北方烽火科技有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1