吳家菊 紀(jì)斌 劉振吉 陳泉根
關(guān)鍵詞: XML Schema; XML; 文檔驗(yàn)證算法; 語(yǔ)法錯(cuò)誤; 錯(cuò)誤信息處理; 錯(cuò)誤位置追蹤
中圖分類號(hào): TN911?34; TP311 ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼: A ? ? ? ? ? ? ? ? ? ?文章編號(hào): 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
XML(Extensible Markup Language)作為一種通用的數(shù)據(jù)描述和交換語(yǔ)言,在Internet上和企業(yè)內(nèi)部得到了廣泛應(yīng)用,當(dāng)前在武器裝備綜合保障領(lǐng)域XML被廣泛用于描述綜合保障數(shù)據(jù)[1]。對(duì)于已編輯的XML數(shù)據(jù),在其應(yīng)用到綜合保障系統(tǒng)或其他應(yīng)用領(lǐng)域之前,需要對(duì)其進(jìn)行語(yǔ)法驗(yàn)證。XML Schema是W3C Recommendation推薦的標(biāo)準(zhǔn),可用于設(shè)計(jì)、約束和驗(yàn)證XML文檔。XML Schema文檔中明確定義了XML文檔中元素的應(yīng)用規(guī)則,比如元素的名稱、具有的屬性、出現(xiàn)次序、出現(xiàn)次數(shù)、數(shù)據(jù)類型、父元素、子元素等[2?3]。因此基于XML Schema設(shè)計(jì)的XML文檔可以使用XML Schema來(lái)驗(yàn)證文檔的語(yǔ)法正確性。
自21世紀(jì)初XML Schema成為W3C Recommendation推薦標(biāo)準(zhǔn)以來(lái),XML Schema由于其諸多優(yōu)勢(shì)正逐步替代DTD(Document Type Definition)成為XML設(shè)計(jì)、約束和驗(yàn)證的主流方式[4]。國(guó)內(nèi)外有諸多基于XML Schema驗(yàn)證XML文檔的研究。余雙等學(xué)者在中科院軟件所開發(fā)的OnceStAXParser的基礎(chǔ)上設(shè)計(jì)實(shí)現(xiàn)了基于XML Schema的高效XML驗(yàn)證器[5?6]。王偉良等學(xué)者首先基于XML Schema構(gòu)造了其抽象模型(Abstract XML Schema Model, AXSM),然后提出了一種基于XML Schema驗(yàn)證XML文檔的方法[7]。許桂艷等學(xué)者基于SAX(Simple API for XML)解析實(shí)現(xiàn)了一種基于XML Schema驗(yàn)證XML文檔的方法[8?9]。其他學(xué)者在研究過程中提出了其他的驗(yàn)證方法。這些方法都實(shí)現(xiàn)了基于XML Schema驗(yàn)證XML文檔,并且能夠有效地輸出錯(cuò)誤信息。隨著深入的研究發(fā)現(xiàn),這些方法或基于特定的平臺(tái)或解析器,或作為獨(dú)立的系統(tǒng)存在,在跨平臺(tái)可移植性、輕量化設(shè)計(jì)、易集成性等方面存有缺陷,并且在實(shí)際應(yīng)用中不支持錯(cuò)誤位置追蹤。
為解決當(dāng)前基于XML Schema驗(yàn)證XML文檔研究中存在的缺陷和實(shí)現(xiàn)依據(jù)錯(cuò)誤信息追蹤錯(cuò)誤位置,本文提出一種跨平臺(tái)可移植性性好、輕量化設(shè)計(jì)、易于與其他系統(tǒng)集成的基于XML Schema驗(yàn)證XML文檔的算法。該方法基于DOM(Document Object Model)[10]解析,支持依據(jù)錯(cuò)誤信息追蹤錯(cuò)誤位置。通過配合使用錯(cuò)誤信息,方便XML數(shù)據(jù)編輯人員找尋文檔中語(yǔ)法錯(cuò)誤位置,提高了XML數(shù)據(jù)編輯人員的工作效率。當(dāng)前該方法已集成到某XML編輯器中,在實(shí)踐中驗(yàn)證了其可行性。
為了實(shí)現(xiàn)該算法跨平臺(tái)可移植性、輕量化設(shè)計(jì)、易集成性,首先對(duì)該算法進(jìn)行設(shè)計(jì)。算法設(shè)計(jì)如圖1所示。算法后續(xù)描述使用Java編程語(yǔ)言,對(duì)于其他編程語(yǔ)言,則只需用該編程語(yǔ)言實(shí)現(xiàn)算法的設(shè)計(jì)。
為了完整地描述該算法的設(shè)計(jì)思想,算法描述從已編輯并保存的XML文檔開始。若將該算法移植或集成到XML編輯器中時(shí),可以省略前兩步,直接依據(jù)保存已編輯XML數(shù)據(jù)的Document類型文檔獲取其克隆文檔,然后執(zhí)行后續(xù)的步驟。
為保存驗(yàn)證過程中語(yǔ)法錯(cuò)誤信息,在該算法中定義一個(gè)String類型的變量(為方便描述,命名為content。后續(xù)對(duì)變量命名原因相同)。在發(fā)生語(yǔ)法錯(cuò)誤時(shí)由錯(cuò)誤處理函數(shù)獲取錯(cuò)誤信息,并將錯(cuò)誤信息更新到content中。最后將content中保存的XML文檔所有語(yǔ)法錯(cuò)誤信息輸出。
2.1 ?定義錯(cuò)誤類
為實(shí)現(xiàn)本文后面描述算法的錯(cuò)誤位置追蹤功能,在該算法中將驗(yàn)證過程中出現(xiàn)的每一個(gè)語(yǔ)法錯(cuò)誤都實(shí)例化為一個(gè)錯(cuò)誤對(duì)象,為此在該算法中定義一個(gè)錯(cuò)誤類(命名為Error)。Error類的定義過程包括:
1) 在Error中定義兩個(gè)變量:一個(gè)為Node類型的變量(命名為node);一個(gè)為int類型的變量(命名為p1)。
2) 在Error中定義構(gòu)造函數(shù),構(gòu)造函數(shù)有兩個(gè)傳入?yún)?shù):一個(gè)為Node類型,對(duì)應(yīng)于XML文檔的解析文檔中存在語(yǔ)法錯(cuò)誤的節(jié)點(diǎn);另一個(gè)為int類型,對(duì)應(yīng)于上述定義的content變量表示的字符串長(zhǎng)度。
3) 在構(gòu)造函數(shù)中定義變量賦值語(yǔ)句:將Node類型的傳入?yún)?shù)賦值給Error類中定義的node變量;將int類型的傳入?yún)?shù)賦值給Error類中定義的p1變量。
此外在該算法中定義一個(gè)ArrayList<Error>類型的變量errors。該變量中保存按照驗(yàn)證過程實(shí)例化的錯(cuò)誤對(duì)象,錯(cuò)誤對(duì)象加入鏈表的順序按照驗(yàn)證過程中語(yǔ)法錯(cuò)誤順序。
2.2 ?DOM解析XML文檔
DOM可以以一種獨(dú)立于平臺(tái)和語(yǔ)言的方式訪問和修改一個(gè)文檔的內(nèi)容和結(jié)構(gòu),DOM實(shí)際上是以面向?qū)ο蠓绞矫枋龅奈臋n模型[11]。使用DOM定義的接口來(lái)獲得對(duì)文檔中所有元素進(jìn)行訪問的入口,創(chuàng)建文檔,瀏覽文檔結(jié)構(gòu),添加、修改或刪除文檔元素和內(nèi)容[12]。DOM解析XML文檔后所生成的文檔樹會(huì)保存在內(nèi)存中,DOM的這一特性是本算法實(shí)現(xiàn)追蹤錯(cuò)誤發(fā)生位置的基礎(chǔ)。
為保證驗(yàn)證過程不對(duì)源XML文檔造成影響,獲取了XML解析文檔的克隆文檔,該驗(yàn)證算法的所有后續(xù)操作均在克隆文檔中進(jìn)行。
在本文算法中,DOM解析XML文檔以獲取解析文檔,繼而獲取解析文檔的克隆文檔的流程圖如圖2所示。
首先,用Java語(yǔ)言實(shí)現(xiàn)DOM編程接口以獲取解析器實(shí)例;其次,獲取XML文檔的URL路徑,并將該URL路徑作為DOM解析器實(shí)例的傳入?yún)?shù);第三,DOM解析器依據(jù)傳入?yún)?shù)解析XML文檔,獲取解析文檔(命名為doc);第四,解析文檔doc調(diào)用cloneNode()方法獲取doc的克隆文檔(命名為clone)。
2.3 ?對(duì)clone執(zhí)行相關(guān)操作
獲取clone的DOMConfiguration對(duì)象,并為該對(duì)象設(shè)置相關(guān)參數(shù)的步驟如下:
1) clone通過調(diào)用getDomConfig()方法獲取其DOMConfiguration對(duì)象(命名為config);
2) config對(duì)象調(diào)用setParameter(String name, Object value)方法,name值為“schema?type”,value值為“http://www.w3.org/2001/XMLSchema”;
3) config對(duì)象調(diào)用setParameter(String name, Object value)方法,name值為“schema?location”,value值為XML Schema文檔的URL路徑;
4) config對(duì)象調(diào)用setParameter(String name, Object value)方法,name值為“validate”,value值為true;
5) config對(duì)象調(diào)用setParameter(String name, Object value)方法,name值為“error?handler”,value值為錯(cuò)誤處理類的實(shí)例化對(duì)象。
2.4 ?定義錯(cuò)誤處理類
為處理驗(yàn)證過程中出現(xiàn)的語(yǔ)法錯(cuò)誤,獲取錯(cuò)誤信息以及保存錯(cuò)誤信息,在該算法中定義了一個(gè)錯(cuò)誤處理類(命名為handleError),并在該類中定義錯(cuò)誤處理函數(shù)。handleError實(shí)現(xiàn)DOMErrorHandler接口,錯(cuò)誤處理函數(shù)的定義過程如下:
1) 錯(cuò)誤處理函數(shù)有一個(gè)DOMError類型的傳入?yún)?shù)(err)。
2) 定義一個(gè)DOMLocator類型的變量(loc),并將err調(diào)用getLocation()方法獲取的值賦值給loc;
3) 將驗(yàn)證過程中的語(yǔ)法錯(cuò)誤實(shí)例化為Error對(duì)象,并保存在errors變量中,以備進(jìn)行錯(cuò)誤信息追蹤;
4) 判斷語(yǔ)法錯(cuò)誤類型;
5) 更新錯(cuò)誤信息,以備將錯(cuò)誤信息輸出。
其中語(yǔ)法錯(cuò)誤實(shí)例化Error對(duì)象的過程包括:
依據(jù)clone文檔的語(yǔ)法錯(cuò)誤節(jié)點(diǎn)在文檔doc中找到對(duì)應(yīng)節(jié)點(diǎn)node;調(diào)用Error類的構(gòu)造函數(shù)并將node和content.length()作為傳入?yún)?shù),獲取Error對(duì)象。XML文檔第一次出現(xiàn)語(yǔ)法錯(cuò)誤時(shí),在content未更新,因此content.length()=0。
依據(jù)clone文檔的語(yǔ)法錯(cuò)誤節(jié)點(diǎn)在doc中找到對(duì)應(yīng)節(jié)點(diǎn)node的流程圖如圖3所示。其本質(zhì)是從當(dāng)前發(fā)生語(yǔ)法錯(cuò)誤節(jié)點(diǎn)開始向根節(jié)點(diǎn)追溯,在追溯過程中依次保存在錯(cuò)誤節(jié)點(diǎn)之前的兄弟節(jié)點(diǎn)個(gè)數(shù)、在錯(cuò)誤節(jié)點(diǎn)的父節(jié)點(diǎn)之前的兄弟節(jié)點(diǎn)個(gè)數(shù)、在錯(cuò)誤節(jié)點(diǎn)的父節(jié)點(diǎn)的父節(jié)點(diǎn)之前的兄弟節(jié)點(diǎn)個(gè)數(shù)…,依次類推,直到到達(dá)XML文檔的根節(jié)點(diǎn),最后得到一個(gè)ArrayList<Integer>類型的變量。然后根據(jù)變量中保存的int類型的數(shù)據(jù),在doc中從根節(jié)點(diǎn)開始向下追溯,直至在doc中找到與clone中錯(cuò)誤節(jié)點(diǎn)對(duì)應(yīng)的節(jié)點(diǎn)。
其中判斷語(yǔ)法錯(cuò)誤類型的過程包括:
1) err通過調(diào)用getSerivity()方法獲取當(dāng)前語(yǔ)法錯(cuò)誤類型。
2) 判斷該錯(cuò)誤類型屬于DOMError. SERIT? Y_
WARNING,DOMError.SERI? TY_ERROR,DOMError.SERITY_FATAL_ERROR中的哪一類。
3) 將描述錯(cuò)誤類型的相關(guān)信息更新到保存錯(cuò)誤信息的content變量中。
判斷錯(cuò)誤類型的流程圖如圖4所示。該步驟的主要目的是判斷錯(cuò)誤類型并將描述錯(cuò)誤類型的信息更新到content中,以在輸出的錯(cuò)誤信息中標(biāo)明該錯(cuò)誤屬于何種類型。延續(xù)上一步在content中更新的表示錯(cuò)誤類型的內(nèi)容,err通過調(diào)用getMessage()方法獲取詳細(xì)錯(cuò)誤信息,并將錯(cuò)誤信息更新到content中,然后在content中已有內(nèi)容后添加一個(gè)換行符,以便將描述不同錯(cuò)誤信息分行輸出。
2.5 ?定義錯(cuò)誤追蹤函數(shù)
將錯(cuò)誤信息輸出的方式有多種,既可以以文本形式輸出,也可以定義一個(gè)信息輸出面板用于輸出錯(cuò)誤信息。為了達(dá)到該算法能夠依據(jù)錯(cuò)誤信息追蹤錯(cuò)誤位置的目的,在該算法中采用信息輸出面板的方式輸出錯(cuò)誤信息。具體來(lái)說是應(yīng)用GUI編程,首先,定義一個(gè)JFrame;然后,在JFrame中嵌入一個(gè)JEditorPane;第三,判斷content的內(nèi)容是否為空,若為空,則將content變量的內(nèi)容設(shè)為“XML文檔語(yǔ)法正確”;最后,JEditorPane調(diào)用setText()方法,將保存錯(cuò)誤信息的content作為JEditorPane的內(nèi)容,這樣就可以將保存錯(cuò)誤信息的content變量的內(nèi)容輸出。
此外為直觀顯示錯(cuò)誤信息追蹤效果,XML文檔的解析文檔doc同樣要以信息輸出面板的方式輸出。同錯(cuò)誤信息輸出一樣,采用GUI編程,將解析文檔doc中的每個(gè)元素的名稱、屬性、內(nèi)容、子元素、父元素等信息按照XML文檔中元素的順序輸出。
錯(cuò)誤位置追蹤函數(shù)本質(zhì)是一個(gè)JEditorPane的鼠標(biāo)點(diǎn)擊事件函數(shù),當(dāng)鼠標(biāo)點(diǎn)擊在JEditorPane上輸出的錯(cuò)誤信息時(shí),實(shí)現(xiàn)依據(jù)錯(cuò)誤信息追蹤語(yǔ)法錯(cuò)誤位置。
鼠標(biāo)點(diǎn)擊事件函數(shù)定義過程包括:
1) 函數(shù)有一個(gè)MouseEvent類型的傳入?yún)?shù)(命名為e);
2) 在鼠標(biāo)點(diǎn)擊事件函數(shù)中定義三個(gè)int類型的變量和一個(gè)Node類型的變量;
3) 依據(jù)相關(guān)變量確定鼠標(biāo)點(diǎn)擊的錯(cuò)誤信息并將errors變量中對(duì)應(yīng)于錯(cuò)誤信息的error對(duì)象給相關(guān)變量賦值;
4) 在JEditorPane上依據(jù)相關(guān)變量選中鼠標(biāo)位于點(diǎn)擊位置的錯(cuò)誤信息;
5) 依據(jù)相關(guān)變量值在doc中找到存在語(yǔ)法錯(cuò)誤的節(jié)點(diǎn)。
其中:定義的三個(gè)int類型變量分別命名為position,p1,p2; Node類型的變量命名為node;position對(duì)應(yīng)于鼠標(biāo)在JEditorPane的點(diǎn)擊位置,取值由JEditorPane調(diào)用viewToModel(e.getPoint())方法獲取;p1和p2的初始值為0;node的初始值為null。
其中依據(jù)相關(guān)變量確定鼠標(biāo)點(diǎn)擊的錯(cuò)誤信息并將errors變量中對(duì)應(yīng)于錯(cuò)誤信息的error對(duì)象給相關(guān)變量賦值的偽代碼如下:
for(Error err : errors){
if(err.p1 > position){
p2 = err.p1;
break;
}
node = err.node;
p1 = err.p1;
}
在JEditorPane上依據(jù)相關(guān)變量選中該條錯(cuò)誤信息的步驟為:
1) 判斷p2==0是否為真,若為真,則將content變量表示的字符串的長(zhǎng)度值賦值給p2(當(dāng)鼠標(biāo)點(diǎn)擊JEditorPane顯示的最后一條錯(cuò)誤信息時(shí),p2==0)。
2) JEditorPane調(diào)用setCartPosition(p1)和moveCartPosition(p2)方法選中JEditorPane上位于鼠標(biāo)點(diǎn)擊位置處的錯(cuò)誤信息。
上述獲取的node為鼠標(biāo)點(diǎn)擊選中的語(yǔ)法錯(cuò)誤信息對(duì)應(yīng)的節(jié)點(diǎn),在doc中找到該節(jié)點(diǎn)并以高亮的方式顯示該節(jié)點(diǎn)。
為驗(yàn)證該算法的正確性、有效性以及是否能夠依據(jù)錯(cuò)誤信息追蹤錯(cuò)誤位置,將該算法集成到某XML編輯器中。該XML編輯器已編輯的XML數(shù)據(jù)以Document類型的文檔保存。在集成過程中,首先獲取該Document類型文檔的克隆文檔,然后直接執(zhí)行后續(xù)的驗(yàn)證操作。在驗(yàn)證過程中驗(yàn)證結(jié)果如圖5所示。
從圖5可以看出:首先,對(duì)于驗(yàn)證過程中的語(yǔ)法錯(cuò)誤該算法能夠按照錯(cuò)誤發(fā)生順序?qū)㈠e(cuò)誤信息輸出,并且每條錯(cuò)誤信息既包含錯(cuò)誤類型又包含導(dǎo)致錯(cuò)誤的詳細(xì)信息;其次,該算法中設(shè)計(jì)的錯(cuò)誤位置追蹤功能能夠有效地依據(jù)鼠標(biāo)點(diǎn)擊位置首先選擇位于鼠標(biāo)點(diǎn)擊位置的錯(cuò)誤信息,進(jìn)而在XML文檔的DOM解析文檔的信息輸出面板中找到該錯(cuò)誤信息對(duì)應(yīng)的錯(cuò)誤節(jié)點(diǎn)并高亮顯示。為驗(yàn)證該算法驗(yàn)證結(jié)果的正確性,選取若干已知存在語(yǔ)法錯(cuò)誤的XML文檔,將這些XML文檔分別在集成了該算法的XML編輯器和諸如XMLSpy等商用成熟軟件中進(jìn)行驗(yàn)證,然后對(duì)比驗(yàn)證結(jié)果。分析驗(yàn)證結(jié)果發(fā)現(xiàn),該算法能夠完整、有效地驗(yàn)證XML文檔,達(dá)到設(shè)計(jì)要求。
為了實(shí)現(xiàn)基于XML Schema驗(yàn)證XML文檔算法的可移植性性、輕量化設(shè)計(jì)、易集成以及支持錯(cuò)誤追蹤,本文提出一種基于XML Schema驗(yàn)證XML文檔的算法。該算法基于DOM解析XML文檔,為保證驗(yàn)證過程不影響源XML文檔,驗(yàn)證操作在XML文檔的DOM解析文檔的克隆文檔上進(jìn)行。為驗(yàn)證該算法能否準(zhǔn)確、有效地驗(yàn)證XML文檔以及能否實(shí)現(xiàn)錯(cuò)誤位置追蹤,將該算法集成到某XML編輯器中,經(jīng)過一系列的試驗(yàn)驗(yàn)證,該算法達(dá)到了設(shè)計(jì)要求。下一步將在該算法的基礎(chǔ)上實(shí)現(xiàn)語(yǔ)法錯(cuò)誤信息漢化輸出。
注:本文通訊作者為紀(jì)斌。
參考文獻(xiàn)
[1] 徐宗昌.裝備IETM技術(shù)標(biāo)準(zhǔn)實(shí)施指南[M].北京:國(guó)防工業(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ù)的研究與實(shí)現(xiàn)[J].微型機(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驗(yàn)證技術(shù)的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),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模式驗(yàn)證方法[J].計(jì)算機(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的知識(shí)描述與模式驗(yàn)證[J].計(jì)算機(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.