• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于XML Schema XML文檔驗證算法

      2019-02-20 02:07吳家菊紀(jì)斌劉振吉陳泉根
      現(xiàn)代電子技術(shù) 2019年4期
      關(guān)鍵詞:語法錯誤

      吳家菊 紀(jì)斌 劉振吉 陳泉根

      關(guān)鍵詞: XML Schema; XML; 文檔驗證算法; 語法錯誤; 錯誤信息處理; 錯誤位置追蹤

      中圖分類號: TN911?34; TP311 ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識碼: A ? ? ? ? ? ? ? ? ? ?文章編號: 1004?373X(2019)04?0071?05

      An XML document validation algorithm based on XML Schema

      WU Jiaju, JI Bin, LIU Zhenji, CHEN Quangen

      (Institute of Computer Application, China Academy of Engineering Physics, Mianyang 621999, China)

      Abstract: The validation mechanism of the XML document is researched, and an XML document validation algorithm based on XML Schema is proposed in this paper. In the algorithm, the data syntax rules, restraint requirement and type requirement are described by using XML Schema, which can not only verify the syntax correctness of the XML document on the basis of XML Schema, but also provide the processing mechanism of syntax error and support error position tracking. The algorithm can output error information in order according to the error occurring sequence if syntax errors exist in the XML document. The algorithm tracks syntax error position by means of mouse clicking after error information processing, so that the data editing personnel can modify the XML document efficiently and improve their own work efficiency. The algorithm was integrated into an XML editor and a series of experiments were carried out, so as to verify the correctness of the algorithm. The results show that the algorithm can achieve the design requirement.

      Keywords: XML Schema; XML; document validation algorithm; syntax error; error information processing; error position tracking

      0 ?引 ?言

      XML(Extensible Markup Language)作為一種通用的數(shù)據(jù)描述和交換語言,在Internet上和企業(yè)內(nèi)部得到了廣泛應(yīng)用,當(dāng)前在武器裝備綜合保障領(lǐng)域XML被廣泛用于描述綜合保障數(shù)據(jù)[1]。對于已編輯的XML數(shù)據(jù),在其應(yīng)用到綜合保障系統(tǒng)或其他應(yīng)用領(lǐng)域之前,需要對其進(jìn)行語法驗證。XML Schema是W3C Recommendation推薦的標(biāo)準(zhǔn),可用于設(shè)計、約束和驗證XML文檔。XML Schema文檔中明確定義了XML文檔中元素的應(yīng)用規(guī)則,比如元素的名稱、具有的屬性、出現(xiàn)次序、出現(xiàn)次數(shù)、數(shù)據(jù)類型、父元素、子元素等[2?3]。因此基于XML Schema設(shè)計的XML文檔可以使用XML Schema來驗證文檔的語法正確性。

      自21世紀(jì)初XML Schema成為W3C Recommendation推薦標(biāo)準(zhǔn)以來,XML Schema由于其諸多優(yōu)勢正逐步替代DTD(Document Type Definition)成為XML設(shè)計、約束和驗證的主流方式[4]。國內(nèi)外有諸多基于XML Schema驗證XML文檔的研究。余雙等學(xué)者在中科院軟件所開發(fā)的OnceStAXParser的基礎(chǔ)上設(shè)計實現(xiàn)了基于XML Schema的高效XML驗證器[5?6]。王偉良等學(xué)者首先基于XML Schema構(gòu)造了其抽象模型(Abstract XML Schema Model, AXSM),然后提出了一種基于XML Schema驗證XML文檔的方法[7]。許桂艷等學(xué)者基于SAX(Simple API for XML)解析實現(xiàn)了一種基于XML Schema驗證XML文檔的方法[8?9]。其他學(xué)者在研究過程中提出了其他的驗證方法。這些方法都實現(xiàn)了基于XML Schema驗證XML文檔,并且能夠有效地輸出錯誤信息。隨著深入的研究發(fā)現(xiàn),這些方法或基于特定的平臺或解析器,或作為獨立的系統(tǒng)存在,在跨平臺可移植性、輕量化設(shè)計、易集成性等方面存有缺陷,并且在實際應(yīng)用中不支持錯誤位置追蹤。

      為解決當(dāng)前基于XML Schema驗證XML文檔研究中存在的缺陷和實現(xiàn)依據(jù)錯誤信息追蹤錯誤位置,本文提出一種跨平臺可移植性性好、輕量化設(shè)計、易于與其他系統(tǒng)集成的基于XML Schema驗證XML文檔的算法。該方法基于DOM(Document Object Model)[10]解析,支持依據(jù)錯誤信息追蹤錯誤位置。通過配合使用錯誤信息,方便XML數(shù)據(jù)編輯人員找尋文檔中語法錯誤位置,提高了XML數(shù)據(jù)編輯人員的工作效率。當(dāng)前該方法已集成到某XML編輯器中,在實踐中驗證了其可行性。

      1 ?算法設(shè)計

      為了實現(xiàn)該算法跨平臺可移植性、輕量化設(shè)計、易集成性,首先對該算法進(jìn)行設(shè)計。算法設(shè)計如圖1所示。算法后續(xù)描述使用Java編程語言,對于其他編程語言,則只需用該編程語言實現(xiàn)算法的設(shè)計。

      為了完整地描述該算法的設(shè)計思想,算法描述從已編輯并保存的XML文檔開始。若將該算法移植或集成到XML編輯器中時,可以省略前兩步,直接依據(jù)保存已編輯XML數(shù)據(jù)的Document類型文檔獲取其克隆文檔,然后執(zhí)行后續(xù)的步驟。

      2 ?算法實現(xiàn)

      為保存驗證過程中語法錯誤信息,在該算法中定義一個String類型的變量(為方便描述,命名為content。后續(xù)對變量命名原因相同)。在發(fā)生語法錯誤時由錯誤處理函數(shù)獲取錯誤信息,并將錯誤信息更新到content中。最后將content中保存的XML文檔所有語法錯誤信息輸出。

      2.1 ?定義錯誤類

      為實現(xiàn)本文后面描述算法的錯誤位置追蹤功能,在該算法中將驗證過程中出現(xiàn)的每一個語法錯誤都實例化為一個錯誤對象,為此在該算法中定義一個錯誤類(命名為Error)。Error類的定義過程包括:

      1) 在Error中定義兩個變量:一個為Node類型的變量(命名為node);一個為int類型的變量(命名為p1)。

      2) 在Error中定義構(gòu)造函數(shù),構(gòu)造函數(shù)有兩個傳入?yún)?shù):一個為Node類型,對應(yīng)于XML文檔的解析文檔中存在語法錯誤的節(jié)點;另一個為int類型,對應(yīng)于上述定義的content變量表示的字符串長度。

      3) 在構(gòu)造函數(shù)中定義變量賦值語句:將Node類型的傳入?yún)?shù)賦值給Error類中定義的node變量;將int類型的傳入?yún)?shù)賦值給Error類中定義的p1變量。

      此外在該算法中定義一個ArrayList<Error>類型的變量errors。該變量中保存按照驗證過程實例化的錯誤對象,錯誤對象加入鏈表的順序按照驗證過程中語法錯誤順序。

      2.2 ?DOM解析XML文檔

      DOM可以以一種獨立于平臺和語言的方式訪問和修改一個文檔的內(nèi)容和結(jié)構(gòu),DOM實際上是以面向?qū)ο蠓绞矫枋龅奈臋n模型[11]。使用DOM定義的接口來獲得對文檔中所有元素進(jìn)行訪問的入口,創(chuàng)建文檔,瀏覽文檔結(jié)構(gòu),添加、修改或刪除文檔元素和內(nèi)容[12]。DOM解析XML文檔后所生成的文檔樹會保存在內(nèi)存中,DOM的這一特性是本算法實現(xiàn)追蹤錯誤發(fā)生位置的基礎(chǔ)。

      為保證驗證過程不對源XML文檔造成影響,獲取了XML解析文檔的克隆文檔,該驗證算法的所有后續(xù)操作均在克隆文檔中進(jìn)行。

      在本文算法中,DOM解析XML文檔以獲取解析文檔,繼而獲取解析文檔的克隆文檔的流程圖如圖2所示。

      首先,用Java語言實現(xiàn)DOM編程接口以獲取解析器實例;其次,獲取XML文檔的URL路徑,并將該URL路徑作為DOM解析器實例的傳入?yún)?shù);第三,DOM解析器依據(jù)傳入?yún)?shù)解析XML文檔,獲取解析文檔(命名為doc);第四,解析文檔doc調(diào)用cloneNode()方法獲取doc的克隆文檔(命名為clone)。

      2.3 ?對clone執(zhí)行相關(guān)操作

      獲取clone的DOMConfiguration對象,并為該對象設(shè)置相關(guān)參數(shù)的步驟如下:

      1) clone通過調(diào)用getDomConfig()方法獲取其DOMConfiguration對象(命名為config);

      2) config對象調(diào)用setParameter(String name, Object value)方法,name值為“schema?type”,value值為“http://www.w3.org/2001/XMLSchema”;

      3) config對象調(diào)用setParameter(String name, Object value)方法,name值為“schema?location”,value值為XML Schema文檔的URL路徑;

      4) config對象調(diào)用setParameter(String name, Object value)方法,name值為“validate”,value值為true;

      5) config對象調(diào)用setParameter(String name, Object value)方法,name值為“error?handler”,value值為錯誤處理類的實例化對象。

      2.4 ?定義錯誤處理類

      為處理驗證過程中出現(xiàn)的語法錯誤,獲取錯誤信息以及保存錯誤信息,在該算法中定義了一個錯誤處理類(命名為handleError),并在該類中定義錯誤處理函數(shù)。handleError實現(xiàn)DOMErrorHandler接口,錯誤處理函數(shù)的定義過程如下:

      1) 錯誤處理函數(shù)有一個DOMError類型的傳入?yún)?shù)(err)。

      2) 定義一個DOMLocator類型的變量(loc),并將err調(diào)用getLocation()方法獲取的值賦值給loc;

      3) 將驗證過程中的語法錯誤實例化為Error對象,并保存在errors變量中,以備進(jìn)行錯誤信息追蹤;

      4) 判斷語法錯誤類型;

      5) 更新錯誤信息,以備將錯誤信息輸出。

      其中語法錯誤實例化Error對象的過程包括:

      依據(jù)clone文檔的語法錯誤節(jié)點在文檔doc中找到對應(yīng)節(jié)點node;調(diào)用Error類的構(gòu)造函數(shù)并將node和content.length()作為傳入?yún)?shù),獲取Error對象。XML文檔第一次出現(xiàn)語法錯誤時,在content未更新,因此content.length()=0。

      依據(jù)clone文檔的語法錯誤節(jié)點在doc中找到對應(yīng)節(jié)點node的流程圖如圖3所示。其本質(zhì)是從當(dāng)前發(fā)生語法錯誤節(jié)點開始向根節(jié)點追溯,在追溯過程中依次保存在錯誤節(jié)點之前的兄弟節(jié)點個數(shù)、在錯誤節(jié)點的父節(jié)點之前的兄弟節(jié)點個數(shù)、在錯誤節(jié)點的父節(jié)點的父節(jié)點之前的兄弟節(jié)點個數(shù)…,依次類推,直到到達(dá)XML文檔的根節(jié)點,最后得到一個ArrayList<Integer>類型的變量。然后根據(jù)變量中保存的int類型的數(shù)據(jù),在doc中從根節(jié)點開始向下追溯,直至在doc中找到與clone中錯誤節(jié)點對應(yīng)的節(jié)點。

      其中判斷語法錯誤類型的過程包括:

      1) err通過調(diào)用getSerivity()方法獲取當(dāng)前語法錯誤類型。

      2) 判斷該錯誤類型屬于DOMError. SERIT? Y_

      WARNING,DOMError.SERI? TY_ERROR,DOMError.SERITY_FATAL_ERROR中的哪一類。

      3) 將描述錯誤類型的相關(guān)信息更新到保存錯誤信息的content變量中。

      判斷錯誤類型的流程圖如圖4所示。該步驟的主要目的是判斷錯誤類型并將描述錯誤類型的信息更新到content中,以在輸出的錯誤信息中標(biāo)明該錯誤屬于何種類型。延續(xù)上一步在content中更新的表示錯誤類型的內(nèi)容,err通過調(diào)用getMessage()方法獲取詳細(xì)錯誤信息,并將錯誤信息更新到content中,然后在content中已有內(nèi)容后添加一個換行符,以便將描述不同錯誤信息分行輸出。

      2.5 ?定義錯誤追蹤函數(shù)

      將錯誤信息輸出的方式有多種,既可以以文本形式輸出,也可以定義一個信息輸出面板用于輸出錯誤信息。為了達(dá)到該算法能夠依據(jù)錯誤信息追蹤錯誤位置的目的,在該算法中采用信息輸出面板的方式輸出錯誤信息。具體來說是應(yīng)用GUI編程,首先,定義一個JFrame;然后,在JFrame中嵌入一個JEditorPane;第三,判斷content的內(nèi)容是否為空,若為空,則將content變量的內(nèi)容設(shè)為“XML文檔語法正確”;最后,JEditorPane調(diào)用setText()方法,將保存錯誤信息的content作為JEditorPane的內(nèi)容,這樣就可以將保存錯誤信息的content變量的內(nèi)容輸出。

      此外為直觀顯示錯誤信息追蹤效果,XML文檔的解析文檔doc同樣要以信息輸出面板的方式輸出。同錯誤信息輸出一樣,采用GUI編程,將解析文檔doc中的每個元素的名稱、屬性、內(nèi)容、子元素、父元素等信息按照XML文檔中元素的順序輸出。

      錯誤位置追蹤函數(shù)本質(zhì)是一個JEditorPane的鼠標(biāo)點擊事件函數(shù),當(dāng)鼠標(biāo)點擊在JEditorPane上輸出的錯誤信息時,實現(xiàn)依據(jù)錯誤信息追蹤語法錯誤位置。

      鼠標(biāo)點擊事件函數(shù)定義過程包括:

      1) 函數(shù)有一個MouseEvent類型的傳入?yún)?shù)(命名為e);

      2) 在鼠標(biāo)點擊事件函數(shù)中定義三個int類型的變量和一個Node類型的變量;

      3) 依據(jù)相關(guān)變量確定鼠標(biāo)點擊的錯誤信息并將errors變量中對應(yīng)于錯誤信息的error對象給相關(guān)變量賦值;

      4) 在JEditorPane上依據(jù)相關(guān)變量選中鼠標(biāo)位于點擊位置的錯誤信息;

      5) 依據(jù)相關(guān)變量值在doc中找到存在語法錯誤的節(jié)點。

      其中:定義的三個int類型變量分別命名為position,p1,p2; Node類型的變量命名為node;position對應(yīng)于鼠標(biāo)在JEditorPane的點擊位置,取值由JEditorPane調(diào)用viewToModel(e.getPoint())方法獲取;p1和p2的初始值為0;node的初始值為null。

      其中依據(jù)相關(guān)變量確定鼠標(biāo)點擊的錯誤信息并將errors變量中對應(yīng)于錯誤信息的error對象給相關(guān)變量賦值的偽代碼如下:

      for(Error err : errors){

      if(err.p1 > position){

      p2 = err.p1;

      break;

      }

      node = err.node;

      p1 = err.p1;

      }

      在JEditorPane上依據(jù)相關(guān)變量選中該條錯誤信息的步驟為:

      1) 判斷p2==0是否為真,若為真,則將content變量表示的字符串的長度值賦值給p2(當(dāng)鼠標(biāo)點擊JEditorPane顯示的最后一條錯誤信息時,p2==0)。

      2) JEditorPane調(diào)用setCartPosition(p1)和moveCartPosition(p2)方法選中JEditorPane上位于鼠標(biāo)點擊位置處的錯誤信息。

      上述獲取的node為鼠標(biāo)點擊選中的語法錯誤信息對應(yīng)的節(jié)點,在doc中找到該節(jié)點并以高亮的方式顯示該節(jié)點。

      3 ?實驗驗證

      為驗證該算法的正確性、有效性以及是否能夠依據(jù)錯誤信息追蹤錯誤位置,將該算法集成到某XML編輯器中。該XML編輯器已編輯的XML數(shù)據(jù)以Document類型的文檔保存。在集成過程中,首先獲取該Document類型文檔的克隆文檔,然后直接執(zhí)行后續(xù)的驗證操作。在驗證過程中驗證結(jié)果如圖5所示。

      從圖5可以看出:首先,對于驗證過程中的語法錯誤該算法能夠按照錯誤發(fā)生順序?qū)㈠e誤信息輸出,并且每條錯誤信息既包含錯誤類型又包含導(dǎo)致錯誤的詳細(xì)信息;其次,該算法中設(shè)計的錯誤位置追蹤功能能夠有效地依據(jù)鼠標(biāo)點擊位置首先選擇位于鼠標(biāo)點擊位置的錯誤信息,進(jìn)而在XML文檔的DOM解析文檔的信息輸出面板中找到該錯誤信息對應(yīng)的錯誤節(jié)點并高亮顯示。為驗證該算法驗證結(jié)果的正確性,選取若干已知存在語法錯誤的XML文檔,將這些XML文檔分別在集成了該算法的XML編輯器和諸如XMLSpy等商用成熟軟件中進(jìn)行驗證,然后對比驗證結(jié)果。分析驗證結(jié)果發(fā)現(xiàn),該算法能夠完整、有效地驗證XML文檔,達(dá)到設(shè)計要求。

      4 ?結(jié) ?語

      為了實現(xiàn)基于XML Schema驗證XML文檔算法的可移植性性、輕量化設(shè)計、易集成以及支持錯誤追蹤,本文提出一種基于XML Schema驗證XML文檔的算法。該算法基于DOM解析XML文檔,為保證驗證過程不影響源XML文檔,驗證操作在XML文檔的DOM解析文檔的克隆文檔上進(jìn)行。為驗證該算法能否準(zhǔn)確、有效地驗證XML文檔以及能否實現(xiàn)錯誤位置追蹤,將該算法集成到某XML編輯器中,經(jīng)過一系列的試驗驗證,該算法達(dá)到了設(shè)計要求。下一步將在該算法的基礎(chǔ)上實現(xiàn)語法錯誤信息漢化輸出。

      注:本文通訊作者為紀(jì)斌。

      參考文獻(xiàn)

      [1] 徐宗昌.裝備IETM技術(shù)標(biāo)準(zhǔn)實施指南[M].北京:國防工業(yè)出版社,2012.

      XU Zongchang. Implementary guide of equipment IETM technical standard [M]. Beijing: National Defense Industry Press, 2012.

      [2] W3C. W3C XML Schema definition language (XSD) 1.1 Part 1: Structures [EB/OL]. [2012?04?05]. https://www.w3.org/TR/xmlschema11?1/.

      [3] W3C. W3C XML Schema definition language (XSD) 1.1 Part 2: Datatypes [EB/OL]. [2012?04?05]. https://www.w3.org/TR/xmlschema11?2/.

      [4] 曹風(fēng)華.一種XML解析器技術(shù)的研究與實現(xiàn)[J].微型機與應(yīng)用,2011,30(21):6?10.

      CAO Fenghua. Research and implementation of an XML parser technology [J]. Microcomputer & its applications, 2011, 30(21): 6?10.

      [5] 余雙,曹冬磊,戴蓓潔,等.高效XML驗證技術(shù)的實現(xiàn)[J].計算機工程與設(shè)計,2008,29(4):937?941.

      YU Shuang, CAO Donglei, DAI Beijie, et al. Research on high performance implementation of XML validation [J]. Computer engineering and design, 2008, 29(4): 937?941.

      [6] REN X, CAO D, JIN B. An efficient STAX based XML parser [C]// Proceedings of the 11th Joint International Computer Conference. [S.l.: s.n.], 2005: 203?207.

      [7] 王偉良,施佺,曹渠江.基于XML Schema抽象模型的XML模式驗證方法[J].計算機應(yīng)用與軟件,2007,24(3):41?43.

      WANG Weiliang, SHI Quan, CAO Qujiang. A method for XML document schema validation with abstract XML schema model [J]. Computer applications and software, 2007, 24(3): 41?43.

      [8] 許桂艷,張建,李淼,等.基于XML Schema的知識描述與模式驗證[J].計算機系統(tǒng)應(yīng)用,2008,17(9):33?37.

      XU Guiyan, ZHANG Jian, LI Miao, et al. Knowledge representation and pattern validation based on XML Schema [J]. Computer systems & applications, 2008, 17(9): 33?37.

      [9] PAN Y, ZHANG Y, CHIU K. Hybrid parallelism for XML SAX parsing [C]// Proceedings of IEEE International Conference on Web Service. Beijing: IEEE, 2008: 505?512.

      [10] MA J, ZHANG S, HU T, et al. Parallel speculative Dom?based XML parser [C]// Proceedings of 14th International Conference on High Performance Computing and Communication & 9th International Conference on Embedded Software and Systems. Liverpool: IEEE, 2012: 33?40.

      [11] Jeremy Keith, Jeffrey Sambells.JavaScript DOM編程藝術(shù)[M].北京:人民郵電出版社,2011.

      KEITH J, SAMBELLS J. DOM scripting: Web design with JavaScript and the document object model [M]. Beijing: Posts & Telecom Press, 2011.

      [12] W3C. XML DOM [EB/OL]. [2018?02?26]. http://www.w3school.com.cn/xmldom/dom_intro.asp.

      猜你喜歡
      語法錯誤
      英語翻譯常見錯誤及對策探析
      概念整合理論下英語中介語發(fā)展研究
      漢語負(fù)遷移對英語寫作的影響及啟示
      高中英語寫作中的語法錯誤分析
      定边县| 历史| 漠河县| 安达市| 江华| 台北县| 宜丰县| 翼城县| 安龙县| 文安县| 聊城市| 南投市| 盖州市| 武鸣县| 中宁县| 九龙城区| 黄骅市| 松阳县| 甘孜县| 鄯善县| 东丽区| 东海县| 万年县| 华容县| 田林县| 马山县| 台州市| 灵宝市| 霍邱县| 青浦区| 黑河市| 丹凤县| 新密市| 青田县| 育儿| 于田县| 柳州市| 通州区| 鹿泉市| 南昌县| 睢宁县|