《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 一種XML解析器技術(shù)的研究與實(shí)現(xiàn)
一種XML解析器技術(shù)的研究與實(shí)現(xiàn)
來源:微型機(jī)與應(yīng)用2011年第21期
曹風(fēng)華
(內(nèi)蒙古財(cái)經(jīng)學(xué)院 計(jì)算機(jī)信息管理學(xué)院,內(nèi)蒙古 呼和浩特 010070)
摘要: 介紹了XML解析的詳細(xì)過程,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)特定Schema的XML解析器的自動(dòng)生成工具。該生成工具以一個(gè)XML Schema文件作為輸入,輸出一個(gè)JavaCC詞法和語法規(guī)格說明文件,然后在JavaCC工具的幫助下,生成一個(gè)基于特定XML Schema的XML解析器。實(shí)驗(yàn)證明,這個(gè)生成解析器能夠?qū)ML文檔進(jìn)行解析的同時(shí),驗(yàn)證其有效性。
Abstract:
Key words :

摘  要: 介紹了XML解析的詳細(xì)過程,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)特定Schema的XML解析器的自動(dòng)生成工具。該生成工具以一個(gè)XML Schema文件作為輸入,輸出一個(gè)JavaCC詞法和語法規(guī)格說明文件,然后在JavaCC工具的幫助下,生成一個(gè)基于特定XML Schema的XML解析器。實(shí)驗(yàn)證明,這個(gè)生成解析器能夠?qū)ML文檔進(jìn)行解析的同時(shí),驗(yàn)證其有效性。
關(guān)鍵詞: XML解析器;基于特定模式;驗(yàn)證;解析器生成器;JavaCC

 XML[1](Extensible Markup Language)是一種可擴(kuò)展標(biāo)記語言,可以用來定義其他的標(biāo)記語言。自從XML成為W3C推薦標(biāo)準(zhǔn)以來,XML以其簡單、可擴(kuò)展性、自描述性、平臺(tái)中立的特點(diǎn),正迅速成為Web上信息表示與數(shù)據(jù)交換的標(biāo)準(zhǔn)[2]。目前眾多國際著名公司都宣稱其產(chǎn)品中支持XML,促使XML成為下一代Web的發(fā)展方向。越來越多的網(wǎng)站和Web的應(yīng)用使用XML技術(shù)進(jìn)行信息發(fā)布和數(shù)據(jù)交換,XML已成為一種備受矚目的技術(shù),甚至被譽(yù)為互聯(lián)網(wǎng)上的世界語。XML現(xiàn)已被廣泛應(yīng)用在各種領(lǐng)域,如電子商務(wù)、企業(yè)協(xié)作、Web服務(wù)等。XML解析器是XML應(yīng)用的基礎(chǔ),XML本身只是以純文本對(duì)數(shù)據(jù)進(jìn)行編碼的一種格式,要想利用XML,或是利用XML文件中所編碼的數(shù)據(jù),必須先將數(shù)據(jù)從純文本中解析出來。因此,要求必須有一個(gè)能夠識(shí)別XML文檔信息的文本文件閱讀器(即XML解析器),用來解析XML文檔并提取其中的內(nèi)容。為了提高數(shù)據(jù)的正確性和提高系統(tǒng)的可靠性,XML解析器還要檢查XML實(shí)例文檔是否符合模式的定義和約束,這個(gè)過程稱為XML文檔的有效性驗(yàn)證[3]。但帶有驗(yàn)證功能的解析器通常效率比較低[4]。近年來,有很多旨在提高XML的解析和基于Schema 驗(yàn)證性能的研究,本文在詳細(xì)分析了XML解析器的解析過程的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)特定Schema解析器的生成工具。生成器根據(jù)特定的Schema,自動(dòng)產(chǎn)生一個(gè)遞歸下降的XML解析器。這個(gè)生成解析器能夠?qū)ML文檔同時(shí)進(jìn)行解析和有效性驗(yàn)證。
1 XML與Schema簡介
 可擴(kuò)展標(biāo)記語言XML是由World Wide Web Consortium(W3C)于1998年2月發(fā)布的一種基于文本的數(shù)據(jù)描述語言的通行標(biāo)準(zhǔn),與HTML類似,XML是一種標(biāo)記語言,兩者在語法上有密切的聯(lián)系。不同的是,HTML著重于如何顯示數(shù)據(jù),而XML的設(shè)計(jì)宗旨是存儲(chǔ)和傳輸數(shù)據(jù),著重于如何描述數(shù)據(jù)。XML來源于標(biāo)準(zhǔn)通用標(biāo)記語言SGML(Standard Generalized Markup Language),是SGML的一個(gè)精簡子集[5]。XML有如下的特點(diǎn):
 (1)可擴(kuò)展性:XML是一種元標(biāo)記語言,即XML可用來設(shè)計(jì)和定義標(biāo)記語言,XML強(qiáng)大的功能體現(xiàn)在它可以用來制定自己的標(biāo)記語言。不同的具體應(yīng)用領(lǐng)域可以制定專用的標(biāo)記語言,作為該領(lǐng)域共享數(shù)據(jù)和交換信息的基礎(chǔ)。
 (2)內(nèi)容與表現(xiàn)分離:XML使得用戶界面和結(jié)構(gòu)數(shù)據(jù)之間保持獨(dú)立。XML描述數(shù)據(jù)的內(nèi)容(即數(shù)據(jù)是什么),而數(shù)據(jù)呈現(xiàn)方式則通過樣式單來表示。內(nèi)容與表現(xiàn)分離,使相同的數(shù)據(jù)可以不同的格式在不同的媒體上表現(xiàn)。
 (3)結(jié)構(gòu)化:XML以結(jié)構(gòu)化的方式描述數(shù)據(jù)。這個(gè)特點(diǎn)使得XML能夠描述復(fù)雜的數(shù)據(jù)結(jié)構(gòu),同時(shí)也為關(guān)系數(shù)據(jù)和層次數(shù)據(jù)提供一種方便的描述方式。
 (4)可驗(yàn)證:XML文檔的結(jié)構(gòu)和內(nèi)容由XML模式語言(如DTD,XML Schema等)定義。利用XML文檔所對(duì)應(yīng)的DTD或Schema,可以對(duì)XML文檔有效性進(jìn)行驗(yàn)證,提高了數(shù)據(jù)的可靠性和可用性。
 XML模式(Schema)指的是一類XML文檔的結(jié)構(gòu)或是模型,這個(gè)模型描述了一個(gè)有效XML文檔內(nèi)的元素層次結(jié)構(gòu)和允許的內(nèi)容。模式定義了一個(gè)XML詞匯表,包括元素名稱、屬性名稱等。模式規(guī)定了一個(gè)XML文檔允許出現(xiàn)的元素、相應(yīng)的元素允許出現(xiàn)的屬性以及這些元素的層次結(jié)構(gòu)關(guān)系。XML的模式語言有很多,其中包括文檔類型定義DTD(Document Type Definition)、XML Schema、XML規(guī)則語言描述RELAX(REgular LAnguage description for XML)、XML樹形規(guī)則表示TREX(Tree Regular Expressions for XML)和下一代RELAX NG(RELAX Next Generation)[6]。
 XML Schema是一種使用XML語法的XML模式語言。DTD曾是描述、約束XML文檔最廣泛的方法,但在應(yīng)用的過程中,DTD體現(xiàn)出一些局限性。主要表現(xiàn)在語法與XML語法不一致,只支持有限的數(shù)據(jù)類型而不支持命名空間等方面。作為DTD的后繼者,XML Schema克服了這些缺陷。XML Schema區(qū)別于DTD的主要特性表現(xiàn)在[7]:
 (1)XML Schema本身就是XML文檔,使得XML Schema的處理可以與XML一樣,一些用來處理XML的技術(shù)也可以用來處理XML Schema。
 (2)定義了豐富的數(shù)據(jù)類型,如布爾型、整型、日期時(shí)
間、URI、十進(jìn)制數(shù)等簡單數(shù)據(jù)類型。
 (3)支持用戶自定義數(shù)據(jù)類型。XML Schema支持從現(xiàn)有的數(shù)據(jù)類型派生出新的數(shù)據(jù)類型,類似于面向?qū)ο笾械睦^承。
 (4)充分支持命名空間。
 因此,XML Schema成為W3C的正式推薦標(biāo)準(zhǔn),并正逐步取代XML DTD。
2 Schema解析器生成工具的設(shè)計(jì)與實(shí)現(xiàn)
 基于特定Schema的XML解析器的基本思想是根據(jù)某一特定的Schema,構(gòu)造一個(gè)專用的解析器,這個(gè)解析器能夠?qū)斎氲腦ML文檔進(jìn)行良構(gòu)檢查,同時(shí)驗(yàn)證其有效性。基于特定Schema解析器將XML的解析和驗(yàn)證結(jié)合在一起,在一定程度上提高了基于XML應(yīng)用的效率和性能。但這個(gè)解析器只適用于由這個(gè)Schema定義的XML實(shí)例文檔,對(duì)于由其他Schema定義的XML實(shí)例文檔則無能為力。當(dāng)Schema改變時(shí)或者需要另外一個(gè)Schema定義時(shí),必須重新構(gòu)造一個(gè)解析器。而本文設(shè)計(jì)并實(shí)現(xiàn)了利用JavaCC工具自動(dòng)生成一個(gè)特定Schema解析器的方法。該方法以一個(gè)Schema文件為輸入,生成一個(gè)基于這個(gè)Schema的解析器。
自動(dòng)生成特定解析器的基本流程如圖1所示。由于Schema文檔本身也是一種XML文檔,所以完全可以使用通用的XML解析器對(duì)其解析,也可以構(gòu)造一個(gè)專用于解析Schema的解析器,但由于Schema的語法比較復(fù)雜,構(gòu)造起來比較困難。一種較容易實(shí)現(xiàn)的方法是先將Schema轉(zhuǎn)化為XML樹模型的表示,再轉(zhuǎn)換為Schema的抽象模型表示?;谔囟⊿chema的XML解析器生成工具的基本步驟如下:
 (1)首先利用JavaCC構(gòu)造一個(gè)通用的XML解析器(GeneralParser)。
 (2)通用XML解析器將Schema輸入文件解析成一個(gè)XML語法的元素節(jié)點(diǎn)樹。
 (3)遍歷這一XML語法的樹模型,將其轉(zhuǎn)換為Schema語法的抽象模型。
 (4)根據(jù)Schema抽象模型,生成特定解析器的詞法和語法規(guī)格說明。
 (5)利用JavaCC,生成基于輸入Schema的專用XML解析器。
2.1 構(gòu)造XML解析器
 構(gòu)造XML解析器的目的在于解析Schema文檔,提取其描述和約束XML文檔結(jié)構(gòu)和內(nèi)容的信息。XML Schema遵循XML語法,因此可以使用任何通用的XML解析器對(duì)其解析。下面介紹一個(gè)用于解析XML Schema文檔的XML解析器的構(gòu)造。
 由于XML文檔是可以包含DTD聲明和DTD子集的,所以處理XML文檔時(shí)也應(yīng)該包含DTD的語法的處理。但是XML Schema也是一種XML文檔,一般不會(huì)包含DTD聲明和定義。另外,由XML Schema定義的XML實(shí)例文檔通常也不會(huì)再用DTD定義,所以也不會(huì)包含DTD的聲明或DTD子集。因此,在處理XML Schema文檔時(shí)不考慮DTD語法的處理;在生成這個(gè)Schema定義的XML實(shí)例文檔的解析器時(shí),也不考慮DTD語法的處理。這樣有助于簡化設(shè)計(jì)和實(shí)現(xiàn)。
2.1.1 構(gòu)造詞法分析器
 JavaCC能根據(jù)輸入的詞法規(guī)格說明,產(chǎn)生一個(gè)基于DFA的詞法分析器。因此需要提供一個(gè)合適的詞法規(guī)格說明。
 JavaCC的詞法規(guī)格說明使用正則表達(dá)式定義詞法結(jié)構(gòu),每一個(gè)詞法記號(hào)(Token)名稱對(duì)應(yīng)著一個(gè)正則表達(dá)式,例如:<S:(""|"\t"|"\n"|"\r")+>表示空白空間的詞法構(gòu)成,其中S是助記符,而(""|"\t"|"\n"|"\r")+是相應(yīng)的正則表達(dá)式,表示由一個(gè)或多個(gè)分隔字符組成的字符串,分隔字符包括空格、制表符′\t′、換行符′\n′和′\r′。
XML規(guī)范中表示詞法結(jié)構(gòu)的表達(dá)式,很多可以比較容易地轉(zhuǎn)換為JavaCC詞法規(guī)格說明的正則表達(dá)式形式。但有一些需要特殊的處理才能轉(zhuǎn)換為JavaCC可以識(shí)別的表示形式。
 JavaCC的詞法規(guī)格說明由一些詞法狀態(tài)和定義在各個(gè)詞法狀態(tài)內(nèi)的正則表達(dá)式組成。生成的詞法分析器在分析詞法的任何時(shí)候都只能處于一個(gè)詞法狀態(tài)中。這種機(jī)制能夠有效地解決多個(gè)正則表達(dá)式發(fā)生沖突的問題。例如,識(shí)別標(biāo)記間的字符數(shù)據(jù)的正則表達(dá)式可以表示為:<CHAR_DATA:(~["<","&","]"]|"]"~["<","&","]"]|"]"("]")+~["<","&",">"])+("]")*>,這與其他很多記號(hào)的正則表達(dá)式相沖突,包括標(biāo)記中的元素名 <IDENTIFIER:<NAME>>。這是因?yàn)閮蓚€(gè)正則表達(dá)式表示的語言有公共子集,當(dāng)出現(xiàn)公共子集中的一個(gè)串時(shí),詞法分析器不知道應(yīng)該匹配哪一個(gè)正則表達(dá)式。實(shí)際上JavaCC只將其匹配為在詞法規(guī)格文件中較早出現(xiàn)的那個(gè)表達(dá)式。利用詞法狀態(tài)可以解決這類問題,使元素名只會(huì)出現(xiàn)在標(biāo)記中,而字符數(shù)據(jù)只出現(xiàn)在標(biāo)記外,因而可以定義兩種詞法狀態(tài):在標(biāo)記中的狀態(tài)和標(biāo)記外狀態(tài),使它們分別在這兩個(gè)詞法狀態(tài)中識(shí)別。詞法狀態(tài)之間的轉(zhuǎn)移可以通過在匹配一個(gè)記號(hào)后,指定要轉(zhuǎn)移的下一個(gè)詞法狀態(tài)來實(shí)現(xiàn)。另一種更靈活的方法是在執(zhí)行詞法動(dòng)作(定義在匹配表達(dá)式后執(zhí)行的Java代碼)時(shí),調(diào)用詞法分析器的SwitchTo()方法,轉(zhuǎn)移到某一指定的狀態(tài)中。
2.1.2 構(gòu)造語法分析器
 JavaCC使用自頂向下遞歸下降的分析方法,并且在需要選擇候選式的地方默認(rèn)向前看一個(gè)符號(hào)進(jìn)行判斷,因此JavaCC使用的也是一種LL(1)的分析方法。XML標(biāo)準(zhǔn)中的EBNF不是LL(1)的文法,這樣會(huì)導(dǎo)致一些選擇的沖突,使得語法分析器不能正確地分析語法。雖然JavaCC也支持LL(k)(k>1)的分析方法,即在所有的選擇點(diǎn)向前看k個(gè)符號(hào),但這樣會(huì)很大程度地降低解析的效率。解決的方法是對(duì)XML標(biāo)準(zhǔn)中的EBNF表示的文法進(jìn)行改寫,使其成為LL(1)文法。將非LL(1)文法改寫為LL(1)的過程包括消除左遞歸和提取左因子。XML標(biāo)準(zhǔn)中的文法幾乎不存在左遞歸,因此只需要提取左因子。
 XML標(biāo)準(zhǔn)中語法的產(chǎn)生式存在公共左因子的典型例子是元素的產(chǎn)生式。元素及其相關(guān)的EBNF表達(dá)式如表1所示。

 元素產(chǎn)生式的右部是空元素標(biāo)記或開始標(biāo)記后跟元素內(nèi)容和結(jié)束標(biāo)記。其中空元素標(biāo)記和開始標(biāo)記有比較長的公共左因子′<′Name(S Attribute)*S?,當(dāng)語法分析器當(dāng)前的輸入符號(hào)為′<′時(shí),無法確定選擇EmptyElemTag還是STag content ETag進(jìn)行推導(dǎo),這時(shí)解析器就會(huì)報(bào)錯(cuò),因此首先要將左因子提取出來。改寫元素的產(chǎn)生式為:
 element::=′<′Name(S Attribute)*S?(′/>′|′>′content ETag)  (1)
 這樣語法分析器遇到′<′時(shí),就不存在選擇的問題,當(dāng)遇到′/>′或′>′時(shí)也能確定唯一的子式。但產(chǎn)生式還不是LL(1)的。其原因在于子式(S Attribute)*S?也存在選擇的沖突。因?yàn)镕IRST((S Attribute)*)∩FOLLOW((S Attribute)*)={S},當(dāng)語法分析器遇到S符號(hào)時(shí),不知道應(yīng)將其匹配為(S Attribute)*中的S,還是匹配為后面的S?中的S。因此還需要對(duì)產(chǎn)生式進(jìn)行進(jìn)一步的改寫。
 先將子式AttS::=((S Attribute)*S?)改寫為等價(jià)的上下文無關(guān)文法,然后如圖2所示提取左因子。

 


 上下文無關(guān)文法用EBNF表示為:
 AttS::=(S(Attribute AttS)?)?(2)
 element改寫為:
 element::=‘<‘Name AttS(‘/>‘|‘>‘content ETag)   (3)
 式(2)中,AttS是一個(gè)非終結(jié)符,語法分析的過程中對(duì)應(yīng)于一個(gè)過程調(diào)用,并且AttS中存在著遞歸,頻繁的調(diào)用與返回會(huì)使系統(tǒng)的消耗較大。因此本文考慮了更好的處理方法:首先對(duì)式(2)進(jìn)析分析,式(2)中存在選擇沖突的原因在于(S Attribute)*的后面存在著S?,S表示空白空間,而一般的程序語言的語法分析是不處理空白空間的,通常在詞法分析階段就把它忽略。是否可以簡單地采取忽略空白的做法呢?答案似乎是不可以。因?yàn)楹雎钥瞻讜?huì)導(dǎo)致一些良構(gòu)約束的檢查變得困難。例如屬性間必須有空白,而且有時(shí)XML文檔中的空白是有意義的,應(yīng)用程序可能會(huì)用到這些空白。但是標(biāo)記內(nèi)部的空白是不會(huì)提交給應(yīng)用程序的,為此可以采取靈活的處理方法:由于XML的EBNF語法中′>′或′/>′前面都必有S?,因此可以把S?與′>′或′/>′合并為一個(gè)單詞。在詞法描述中,定義記號(hào)<SRANGLE:(<S>)?">">和
<SCLOSEDTAG:(<S>)?"/>">分別代替<RANGLE:">">和<CLOSEDTAG:"/>">,這樣就消除了式(1)中的S?,而(S Attribute)*中的S可以保留下來,使得FIRST((S Attribute)*)∩FOLLOW((S Attribute)*)=?準(zhǔn),得到元素的產(chǎn)生式為式(4)。式(4)每識(shí)別一個(gè)屬性比式(2)少了一次過程調(diào)用,并且消除了遞歸。
element::=′<′Name(S Attribute)*(<SRANGLE>|
 <SCLOSEDTAG>content     (4)

 XML解析器采用語法制導(dǎo)的翻譯方法進(jìn)行語義分析,即語義分析在語法分析的過程中完成。在XML文法產(chǎn)生式的右部中,嵌入相應(yīng)的語義動(dòng)作,如創(chuàng)建節(jié)點(diǎn)、添加子節(jié)點(diǎn)和添加屬性等。在分析的過程中,執(zhí)行所遇到的語義動(dòng)作。當(dāng)語法分析結(jié)束而沒有產(chǎn)生任何錯(cuò)誤時(shí),就可以得到一棵包含Schema文檔元素和屬性信息的樹。
2.2 模型轉(zhuǎn)換
 用本文構(gòu)造的XML解析器分析Schema文檔,得到一棵以元素為節(jié)點(diǎn)的樹。這棵樹隱含了所需要的描述約束信息,但它是基于XML語法的,無法被直接利用,因此必須將其轉(zhuǎn)換為Schema語法的對(duì)象模型。
2.2.1 XML Schema抽象模型
 為了能夠生成一個(gè)基于特定Schema的解析器,需要一個(gè)合適的模型來描述Schema文檔的結(jié)構(gòu)和各種成分。XML Schema標(biāo)準(zhǔn)中定義了一個(gè)抽象模型。
XML Schema抽象模型由13種模式成分構(gòu)成,可分為3組:主模式成分、二級(jí)模式成分、助手模式成分。主模式成分包括簡單類型定義、復(fù)雜類型定義、屬性聲明、元素聲明;二級(jí)模式成分包括屬性組定義、本體約束定義、模型組定義、記號(hào)聲明;助手模式成分包括注解、模型組、粒子、通配符、屬性使用。
主模式成分構(gòu)成模式抽象模型的大部分,其中的聲明主要描述了XML實(shí)例文檔的內(nèi)容,而類型定義尤其是復(fù)雜類型定義則描述了XML實(shí)例文檔的結(jié)構(gòu)信息。對(duì)XML實(shí)例文檔的驗(yàn)證主要是對(duì)XML文檔的內(nèi)容和結(jié)構(gòu)兩方面的驗(yàn)證。
 復(fù)雜類型定義使用了其他的模式成分來定義一個(gè)元素的內(nèi)容,這些模式成分包括屬性聲明、屬性組聲明、粒子、模型組等,使用屬性聲明和屬性組定義元素的屬性,是使用一個(gè)粒子類型來定義一個(gè)復(fù)雜的元素內(nèi)容模型。復(fù)雜類型可以派生新的復(fù)雜類型,派生的方式有擴(kuò)展與約束兩種。
 粒子(particle)是描述元素內(nèi)容的一個(gè)術(shù)語,一個(gè)粒子包含兩個(gè)出現(xiàn)次數(shù)約束和一個(gè)項(xiàng)。出現(xiàn)次數(shù)約束包括最大出現(xiàn)次數(shù)和最少出現(xiàn)次數(shù)約束。粒子的項(xiàng)可以是一個(gè)元素或一個(gè)模型組或一個(gè)通配符。
一個(gè)模型組包含了一組粒子,這些粒子的組合關(guān)系是以下三種之一:順序關(guān)系(sequence)、選擇關(guān)系(choice)、全體關(guān)系(all)。順序關(guān)系的粒子必須以順序的次序出現(xiàn);選擇關(guān)系則只出現(xiàn)一個(gè)粒子;全體關(guān)系的粒子可以任意的次序出現(xiàn),每一個(gè)粒子最多只能出現(xiàn)一次,而且其粒子的項(xiàng)只能是元素。模型組與模型組定義緊密聯(lián)系而又有所區(qū)別,模型組定義是具有名字模式成分,相應(yīng)的XML元素是<group>,而模型組相應(yīng)的XML元素是<all>、<choice>和<sequence>。
 XMLSchema只定義了概念上的抽象模型,具體的實(shí)現(xiàn)還需要自己來完成。本文提供了Schema抽象模型的一個(gè)簡化實(shí)現(xiàn)。這個(gè)簡化的實(shí)現(xiàn)暫時(shí)忽略了記號(hào)聲明、本體約束定義、注解和通配符。其他各模式成分也作了相應(yīng)的簡化。簡化后實(shí)現(xiàn)包含以下各類:
 SchemaModel Schema模型類:包含各種模式成分,如元素聲明、屬性聲明、類型定義、模型組定義等。
 XSComponent抽象的模式成分類:所有模式成分類的父類,實(shí)現(xiàn)轉(zhuǎn)換文法接口。
 XSElement元素聲明類:表示元素聲明模式成分。
 XSAttribute屬性聲明類:表示屬性聲明和屬性使用模式成分。
 XSAttGroup屬性組類:表示屬性組定義的模式成分,以及復(fù)雜類型定義中所有屬性聲明的集合。
 XSType抽象類型類:作為簡單類型和復(fù)雜類型父類。
 XSComplexType復(fù)雜類型定義類:表示復(fù)雜類型定義模式成分。
 XSSimpleType簡單類型定義類:表示簡單類型定義模式成分。
 XSModelGroup模型組類:表示模型組及模型組定義模式成分。
 XSParticle粒子類:表示粒子模式成分。
2.2.2 遍歷轉(zhuǎn)換
 XML語法的模型轉(zhuǎn)換為Schema抽象模型通過遍歷元素節(jié)點(diǎn)樹來完成,遍歷使用遞歸的方式進(jìn)行。對(duì)于元素節(jié)點(diǎn)樹中的每一個(gè)非葉子節(jié)點(diǎn),遍歷其子節(jié)點(diǎn),得到相應(yīng)的子模式成分,然后返回本節(jié)點(diǎn)表示的模式成分。
 對(duì)XML的元素節(jié)點(diǎn)樹的遍歷過程實(shí)際上也是對(duì)Schema文檔有效性驗(yàn)證的過程。
 本文介紹了XML解析的詳細(xì)過程,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)特定Schema的XML解析器的自動(dòng)生成工具。這個(gè)生成工具以一個(gè)XML Schema文件作為輸入,輸出一個(gè)JavaCC詞法和語法規(guī)格說明文件,然后在JavaCC工具的幫助下,生成一個(gè)基于特定XML Schema的XML解析器。這個(gè)解析器能夠?qū)ML文檔進(jìn)行解釋的同時(shí),驗(yàn)證其有效性。
參考文獻(xiàn)
[1] 劉芳,肖鐵軍.XML應(yīng)用的基石:XML解析技術(shù)[J].計(jì)算機(jī)工程與設(shè)計(jì),26(19):2823-2839.2005.
[2] CHIU K, LU W. A Compiler-based approach to schema-specific XML parsing[C]. In: The First International Workshop on High Performance XML Processing, New York, USA, May, 2004:17-22.
[3] MATSA M, PERKINS E, HEIFETS A, et al. A high-performance interpretive approach to schema-directed parsing[C]. In: WWW ‘07: Proceedings of the 16th international conference on World Wide Web, New York, NY, USA, ACM. 2007:1093-1102.
[4] ZHANG W, ENGELEN R V. TDX:a high-performance table-driven XML parser[C]. In: ACM-SE 44: Proceedings of the 44th annual Southeast regional conference, New York, NY, USA, ACM. 2006:726-731.
[5] ZHANG W, ENGELEN R V. A table-driven streaming XML parsing methodology for high-performance Web services[C]. In: ICWS ‘06: Proceedings of the IEEE International Conference on Web Services(ICWS’06), Washington, DC, USA, IEEE Computer Society. 2006:197-204.
[6] KOSTOULAS M G, MATSA M, MENDELSOHN N, et al. Xml screamer: an integrated approach to high performance xml parsing, validation and deserialization[C]. In: WWW ‘06: Proceedings of the 15th international conference on World Wide Web, New York, NY, USA, ACM.2006:93-102.
[7] 左偉明.即用即查XML數(shù)據(jù)標(biāo)記語言參考手冊(cè)[M].北京:人民郵電出版社,2007.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。