專利名稱::基于xml模式的數(shù)據(jù)綁定應(yīng)用程序接口生成方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于xml數(shù)據(jù)綁定或代碼自動(dòng)生成領(lǐng)域。
背景技術(shù):
:數(shù)據(jù)綁定技術(shù)提供了一種簡單而直接的方法,使得可以在Java、0++等平臺(tái)應(yīng)用程序中高效的使用XML、Database等各種非結(jié)構(gòu)化的數(shù)據(jù)源。通過數(shù)據(jù)綁定,應(yīng)用程序可以在一定程度上忽略XML文件的實(shí)際結(jié)構(gòu)和數(shù)據(jù)庫中存儲(chǔ)表的結(jié)構(gòu)等因素的制約,而直接使用通過綁定的代碼來訪問數(shù)據(jù)內(nèi)容。在讀寫文件時(shí),一些特殊類型的數(shù)據(jù)(譬如數(shù)字和閂期)可以被轉(zhuǎn)換成程序語言中存在的類型形式,而不是保留為文本形式,這使應(yīng)用程序可以更方便、有效地使用數(shù)據(jù)本身,而不用過多的關(guān)心其所采取的存儲(chǔ)和表示方式。目前市場上有很多技術(shù)產(chǎn)品都實(shí)現(xiàn)了對于XML數(shù)據(jù)綁定的支持。但是它們各G所能支持的Schema特性以及生成的目標(biāo)代碼種類上有十分巨大的差別。當(dāng)需要進(jìn)行數(shù)據(jù)綁定的Schema足夠的簡單和短小時(shí),很多開源技術(shù)就可以滿足要求。但是當(dāng)需要進(jìn)行數(shù)據(jù)綁定的Schema文檔包含復(fù)雜特性(如extensions、restrictions、substitutiongroups等)的時(shí)候,現(xiàn)有的大多數(shù)開源技術(shù)就無法進(jìn)行完全的支持。由Apache基金所支持的XMLBean項(xiàng)目而言,雖然它可以支持大多數(shù)復(fù)雜的Schema結(jié)構(gòu),但是在利用XMLBean進(jìn)行數(shù)據(jù)綁定時(shí),目前還沒有有效的方法來達(dá)到對生成API方法的增加和修改等操作,這導(dǎo)致當(dāng)用戶需要生成高度可定制的API時(shí),XMLBean也無法勝任;另外XMLBean只支持生成Java平臺(tái)下的API,這就使得很多基于其它平臺(tái)的應(yīng)用程序無法直接使用。在0++平臺(tái)下這些問題表現(xiàn)更為突出。針對這些問題以及實(shí)際存在的復(fù)雜xmlschema規(guī)范,本發(fā)明提出了一種自動(dòng)生成用于操作符合xmlSchema規(guī)范的xml文件的數(shù)據(jù)綁定API的方法。該方法以數(shù)據(jù)綁定技術(shù)為基礎(chǔ),首先生成一套與生成目標(biāo)語言類型無關(guān)的中間配置層,然后通過附加獨(dú)立的目標(biāo)代碼生成引擎生成所需類型目標(biāo)代碼。在進(jìn)行數(shù)據(jù)綁定時(shí),通過如下方式進(jìn)行采用以Dom結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),在生成代碼的類中封裝Dom結(jié)點(diǎn)的私有成員變量指針(或引用),并在類的方法中通過Dom指針(或引用)完成對數(shù)據(jù)的操作;在最頂層添加API頂層類,并實(shí)現(xiàn)save和load方法用以對XML文件的進(jìn)行存儲(chǔ)操作,完成對象與xml文本的轉(zhuǎn)換。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種依據(jù)復(fù)雜xmlschema模式,生成操作符合該schema模式的ml文件的數(shù)據(jù)綁定應(yīng)用程序接口方法。本發(fā)明的特征在于歩驟(1),使用JaxMeXS解析器,對輸入到計(jì)算機(jī)中的XMLSchema模式做語法解析和邏輯解析,生成SchemaEl匿nt和Sche腿DataType類型的對象,在其中記錄與Schema相關(guān)的所有信息,其中至少包括子元素列表,屬性列表以及父類型名稱;步驟(1.1),語法解析記錄所有在Schema中定義的數(shù)據(jù)類型datatype,存入到syntax—map中,并單獨(dú)記錄abstract屬性為true的datatype,存入至ljabstract—map中;歩驟(1.2),邏輯解析對Schema進(jìn)行邏輯解析,對于其中定義的元素、數(shù)據(jù)類型分別生成SchemaElement和SchemaDataType類型的對象,并在其中記錄與Sche隨相關(guān)的所有信息,各自形成一個(gè)信息詳單,數(shù)據(jù)項(xiàng)中含有子結(jié)點(diǎn)名、類型以及約束信總;對于所有的element,在所述記錄信息中,包含有根據(jù)Schema中定義來設(shè)置的SchemaElement對象成員變量或成員變量值,以及生成代碼所需的所有Schema信息,并把生成的對象添加到—element列表中;對于所有的數(shù)據(jù)類型datatype,在所述記錄信息中,除了根據(jù)schema中的定義設(shè)置的成員變量或成員變量值以及生成代碼所需的所有schema信息外,當(dāng)該datatype是通過其他數(shù)據(jù)類型經(jīng)過擴(kuò)展或者約束修飾而來,則要在parent_map中記錄兩種數(shù)據(jù)類型之間的繼承關(guān)系,即被擴(kuò)展或約束的類型為本類型的父類型,并把生成的對象添加到—datatype列表;所屬子元素列表至少包含子元素名稱、類型、以及允許出現(xiàn)次數(shù);歩驟(2),接口映射,根據(jù)SchemaDataType和SchemaElement對象中記錄的信息,按以下歩驟,通過接口映射生成目標(biāo)代碼中每個(gè)類以及類中成員變量的接口信息生成DataTypeObject和NodeObject實(shí)體描述對象,以完成從結(jié)點(diǎn)的Schema到對該結(jié)點(diǎn)進(jìn)行操作訪問的應(yīng)用程序接口API操作接口之間的映射步驟(2.1),建立一個(gè)Schema描述信息到API操作接口的對照表,所述API操作接口包括讀、寫、管理以及特有操作接口C畫L,在所述對照表中,包括以下兩種映射關(guān)系基本映射關(guān)系,是對元素或?qū)傩詢?nèi)容的一些基本操作接口的映射規(guī)則,其中包括以下五種關(guān)系對于元素屬性數(shù)據(jù),提供以下兩種API操作接口setXXXAttr,設(shè)置元素某一屬性值,getXXXAttr,獲得元素某一屬性值,對于包含有文本內(nèi)容的元素,當(dāng)出現(xiàn)次數(shù)maxOccur為1時(shí),提供以下兩種操作接U:setText,設(shè)置元素的文本內(nèi)容,getText,獲取元素的文本內(nèi)容,對于包含子元素的元素或者數(shù)據(jù)類型,當(dāng)出現(xiàn)minOccur和maxOccur都為1時(shí),提供以下幾種操作接口addXXX,添加XXX子元素,getXXX,獲得XXX子元素,removeXXX,刪除XXX子元素,當(dāng)子元素包含文字結(jié)點(diǎn)時(shí),提供以下操作接口setXXXText,設(shè)置當(dāng)前元素下XXX子元素中包含的文本內(nèi)容,getXXXText,獲取當(dāng)前元素下XXX子元素中包含的文本內(nèi)容,對于包含的子元素中出現(xiàn)iiiaxOccur大于1時(shí),提供以下幾種操作接口addXXX,添加XXX子元素,getXXXintindex,獲得由索引index所指示的XXX子元素,int是Java內(nèi)置整型數(shù)據(jù)類型,removeXXXintindex,刪除由索引index所知是的XXX子元素,getXXXTextintindex,獲得由索引index所指示的XXX子元素文本內(nèi)容,setXXXTextintindex,設(shè)置由索引index所指示的XXX子元素文本內(nèi)容,getXXXList,獲得當(dāng)前元素下所有XXX子元素的列表,getXXXTextList,獲得當(dāng)前元素下所有XXX子元素文本內(nèi)容的列表,特有映射針對所述XML特有操作接口,以一種附加的形式連同基本操作接口同時(shí)給出,包括以下四種XPath數(shù)據(jù)訪問接口為所有的屬性、元素和類型定義添加getNodeByXPath,getNodesByXPath以及getValueByXPath特有操作接口,其中g(shù)etNodeByXPath為根據(jù)指定的XPath獲得相應(yīng)結(jié)點(diǎn)對象,getNodesByXPath為根據(jù)指定的XPath獲得相應(yīng)結(jié)點(diǎn)對象列表,getValueByXPath為根據(jù)指定的XPath獲得其對應(yīng)的第一個(gè)結(jié)點(diǎn)對象的文本內(nèi)容,特殊類型數(shù)據(jù)設(shè)置與訪問接口,針對元素文本內(nèi)容可能為HTML格式數(shù)據(jù)內(nèi)容或CDATA格式數(shù)據(jù)內(nèi)容,為所有元素添加以下接口setCDATAText:為當(dāng)前元素設(shè)置CDATA格式的文本內(nèi)容,hasCMTAText:判斷當(dāng)前元素是否含有CDATA格式的文本內(nèi)容,asXML:獲取當(dāng)前元素內(nèi)部所有元素、屬性等的XML文本,并包含當(dāng)前元素的標(biāo)簽,getXML:獲取當(dāng)前元素內(nèi)部所有元素、屬性等的XML文本,不包含當(dāng)前元素的標(biāo)簽,getXMLText:獲取當(dāng)前元素內(nèi)部所有元素、屬性等的XML文本,并去掉其間所有的XML標(biāo)簽,對于Schema中通過正則表達(dá)式對其文本內(nèi)容進(jìn)行格式約束的元素,添加validateType方法,用于檢驗(yàn)所當(dāng)前元素所包含的文本內(nèi)容是否符合類型定義中正則表達(dá)式的限制;對于有多種子類型的數(shù)據(jù)類型定義,提供addXXXofYYYType操作接口,用一個(gè)YYY的實(shí)例來添加為當(dāng)前元素的XXX子元素;步驟(2.2),把歩驟(2.1)中完成接口映射生成的接口對象保存成XML巾間配置文件,供用戶修改該中間配置文件,實(shí)現(xiàn)生成目標(biāo)代碼的個(gè)性化步驟(2.2.1),依次從—datatype列表中取出SchemaDataType對象,依據(jù)該對象中的成員變量值以及預(yù)先如上定義的接口映射規(guī)則為其生成一個(gè)DataTypeObject類對象,在該對象的列表中加入為每個(gè)操作接口生成的NodeMethod對象,把生成的DataTypeObject加入到data—cache—中,所述的NodeMethod對象是依據(jù)上述映射規(guī)則生成的一個(gè)用來對datatype所定義的XML元素進(jìn)行操作的函數(shù)接口描述,其中會(huì)有以下數(shù)據(jù)項(xiàng)name:用來記錄所需生成函數(shù)的函數(shù)名稱,isAttributeMethod:用來記錄是否是對某個(gè)元素屬性進(jìn)行操作的函數(shù),MethodReturn:用來記錄所需生成函數(shù),Arguments:記錄生成函數(shù)的參數(shù)信息,MethodAction:記錄生成函數(shù)的函數(shù)體實(shí)際所需提供的操作信息,步驟(2.2.2),依據(jù)步驟(1.2)中生成的parent—m即中的繼承關(guān)系,為相應(yīng)的兩個(gè)datatype所對應(yīng)的DataTypeObject對象加入依賴關(guān)系;歩驟(2.2.3),依次從—element列表中取出SchemaElement對象,依據(jù)該對象中的成員變量值為其生成一個(gè)NodeObject類,并在NodeObject類中相應(yīng)列表中加入NodeMethod對象,用以記錄需要生成的成員函數(shù)接口描述,并把生成的NodeObject加入到cache—中;步驟(2.2.4),把所得到的cache—和data_cache—中的對象保存成xml形式——配置文件,作為中間代碼備用,供用戶修改,實(shí)現(xiàn)API操作接口的定制;步驟(3),從XML中間代碼讀入步驟(2.2.4)所述經(jīng)過用戶修改的中間層配置文件,然后在內(nèi)存中生成DataTypeObject和NodeObject的對象,分別相應(yīng)的保存到data—cache—和cache—中;步驟(4),針對不同的程序設(shè)計(jì)語言,使用代碼生成程序,生成API源代碼步驟(4.1),對于cache—中的每一個(gè)對象,利用相應(yīng)的程序設(shè)計(jì)語言代碼生成程序,生成用于操作xml文件中element的interface以及實(shí)現(xiàn)類,所述的實(shí)現(xiàn)類是指用于實(shí)現(xiàn)該類的對應(yīng)的接口中定義的接口interface中定義的接口函數(shù),在每個(gè)具體的實(shí)現(xiàn)類中要把該類對應(yīng)的XML元素在doni樹上的doni結(jié)點(diǎn)對象作為私有變量封裝在該類中,類中對于該元素的操作要調(diào)用該dom節(jié)點(diǎn)中相應(yīng)的函數(shù)來實(shí)現(xiàn);步驟(4.2),對于data—cache—中的每一個(gè)對象,用所述歩驟(4.1)的方法來生成用于操作xml文件中datatype所定義的元素的接口以及實(shí)現(xiàn)類;但是,若該datatype在schema中定義為abstract,則生成的接口也設(shè)置為abstract,若該datatype是從其他數(shù)據(jù)類型約束或擴(kuò)展而來,則為該接口添加與父接口的繼承關(guān)系;步驟(4.3),把步驟(4.1)或步驟(4.2)生成的代碼寫出到文件,生成源代碼文件;步驟(5),添加頂層工廠類、編譯并打包所生成的代碼文件,以封裝成一個(gè)二進(jìn)制包作為發(fā)行包以供用戶使用-步驟(5.1),在所述API頂層添加APIFactory類,為用戶提供統(tǒng)一的操作入口;步驟(5.2),使用幵源工具Ant提供的API,調(diào)用API完成包括代碼文件的編譯,打包以及說明文檔的生成。申請所采用的自動(dòng)生成XML數(shù)據(jù)綁定API的方法已經(jīng)應(yīng)用于C剛L中文新聞置標(biāo)語g標(biāo)準(zhǔn)管理系統(tǒng)中。在實(shí)際的測試中,自動(dòng)生成的API具有健壯、穩(wěn)定等特點(diǎn),同時(shí)其執(zhí)行效率也滿足要求。CNML標(biāo)準(zhǔn)幾次簡單改動(dòng),使用這種方法實(shí)現(xiàn)的系統(tǒng)幾乎可以不用更改任何代碼而重新生成符合要求的API,具有很大的靈活性。圖l.生成配置文件流程圖。圖2.生成目標(biāo)代碼流程圖。圖3.XMLAPI生成系統(tǒng)設(shè)計(jì)圖。圖4.Schema源信息與操作接口映射關(guān)系圖。具體實(shí)施例方式本發(fā)明的目的在于提供一種用于自動(dòng)生成依據(jù)復(fù)雜xmlschema生成操作符合該schema的xml文件的數(shù)據(jù)綁定API方法。本發(fā)明所提出的方法的思路在于首先通過對復(fù)雜xmlschema的解析,取得其中關(guān)于xml元素(element)和數(shù)據(jù)類型(datatype)的定義,以及數(shù)據(jù)類型之間諸如約束、擴(kuò)充等復(fù)雜關(guān)系;然后依據(jù)所得到的schema信息,生成API接口的中間配置文件;接著,對于不同的API目標(biāo)代碼類型,附加上不同的代碼生成引擎,依據(jù)API接口配置文件生成最終的API:源代碼。最后,通過API封裝引擎對生成原始代碼進(jìn)行封裝和發(fā)布的處理,主要包括增加基于Factory設(shè)計(jì)模式的API生成接口,增加測試用例和一些說明文檔等內(nèi)容。最終編譯生成各種形式的標(biāo)準(zhǔn)API發(fā)布二進(jìn)制文件包。所述方法是基于一個(gè)已經(jīng)存在的xmlschema文檔次按以下歩驟具體實(shí)現(xiàn)的,所采用的方法流程圖請見圖1和圖2。一種依據(jù)xmlschema生成操作符合該schema的xml文件的數(shù)據(jù)綁定API方法,其特征在于所述方法依次會(huì)有以下步驟步驟(1)使用JaxMeXS解析器提供的語法解析和邏輯解析功能,共同完成對復(fù)雜xmlschema的解析,通過解析對于Schema中定義的元素、數(shù)據(jù)類型分別生成SchemaElement和SchemaDataType類型的對象,并在其中記錄與Schema相關(guān)的所有信息,如包含子元素名稱、類型和允許出現(xiàn)次數(shù)等信息的子元素列表,屬性列表,父類型名稱.-步驟(1.1)調(diào)用語法解析功能,對輸入的schema進(jìn)行解析,并把解析所得的所有類型存入syntax—map,同時(shí)把抽象類型放到abstract—map中,留為后續(xù)歩驟備用。步驟(1.2)對輸入的schema進(jìn)行邏輯解析,得到schema中所有的datatype,為每個(gè)datatype建立SchemaDataType類的對象,并依據(jù)schema中的定義添加和設(shè)置對象的成員變量或成員變量值,在該對象中,把生成代碼所需的所有schema信息記錄下來。包括子元素的名稱,子元素的類型和允許出現(xiàn)次數(shù)等信息的子元素列表和屬性列表。如果該datatype是通過其他數(shù)據(jù)類型經(jīng)過擴(kuò)展(extension)或者約束(restriction)修飾而來,則需要在parent—map中記錄兩種數(shù)據(jù)類型之間的繼承關(guān)系,即被擴(kuò)展或約束的類型為本類型的父類型。最后把生成的對象添加到—datatype列表中備用。步驟(l.3)從schema邏輯解析結(jié)果中得到schema中所有的element,為每個(gè)element建立SchemaElement類的對象,與(1.2)類似,依據(jù)schema中的定義添加和設(shè)置對象的成員變量或成員變量值,在該對象中,把生成代碼所需的所有schema信息記錄下來,最后把生成的對象添加到一element列表中備用。步驟(2)接口映射步驟(見圖4):對從歩驟(1)中得到的SchemaDataType和SchemaElement對象,通過進(jìn)行接口映射,分別生成DataTypeObject和NodeObject實(shí)體描述對象。按照SchemaDataType和SchemaElement對象中包含的Schema信息的特點(diǎn)以及需要對其進(jìn)行的操作,添加與生成代碼相對應(yīng)的記錄。在接口映射歩驟中將完成從基本的Schema結(jié)點(diǎn)描述信息到對其進(jìn)行操作訪問的API接口之間的映射。步驟(2.1)依次從—datatype列表中取出SchemaDataType對象,依據(jù)該對象中的成員變量值以及預(yù)先定義的接口映射規(guī)則為其生成一個(gè)DataTypeObject類對象,并該對象中相應(yīng)列表中加入NodeMethod對象,每個(gè)NodeMethod對象都是一個(gè)用來對該datatype定義的xmlelement進(jìn)行操作的函數(shù)(方法)的接口的描述。把生成的DataTypeObject加入到data—cache—中。步驟(2.2)依據(jù)(1.2)中生成的parent—map中的繼承關(guān)系,為相應(yīng)的兩個(gè)datatype對應(yīng)的DataTypeObject對象加入依賴關(guān)系,從而在生成代碼時(shí)可以為這些類正確加入繼承關(guān)系。步驟(2.3)依次從—element列表中取出SchemaElement對象,依據(jù)該對象中的成員變量值為其生成一個(gè)NodeObject類,并在NodeObject類中相應(yīng)列表中加入NodeMethod對象,用以記錄需要生成的成員函數(shù)接口描述。把生成的NodeObject加入到cache—中。步驟(2.4)把cache一和data—cache—中對象保存成xml形式的配置文件作為中間代碼備用,用戶可以根據(jù)自己需求對中間代碼進(jìn)行修改,從而達(dá)到定制API的目的。步驟(3)從xml中間代碼讀入中間層配置文件,并在內(nèi)存中生成DataTypeObject和NodeObject的對象分別保存到cache—和data一cache—中。這一步可以看作是歩驟(2.4)的逆步驟。步驟(4)對于cache—和data一cache一中的所有對象,依照其私有成員變量規(guī)定的程序接口生成目標(biāo)源代碼。以java代碼生成為例,其歩驟如下-步驟(4.1)對于cache—中的每一個(gè)對象,利用JaxMEJavaSource提供的API生成用于操作xml文件中element的interface以及實(shí)現(xiàn)類。步驟(4.1.1)設(shè)置interface的訪問級(jí)別為public并在其中加入方法的聲明;添加對于該interface的注釋信息用于將來生成javadoc文件;對丁取值定義為枚舉類型具有枚舉類型屬性(attribute)的element,在interface中定義與枚舉類型相對應(yīng)的公有靜態(tài)成員變量以及相關(guān)注釋信息;在interface中聲明用于操作element的所有方法原型,并添加關(guān)于方法的注釋。步驟(4.1.2)生成類實(shí)現(xiàn)歩驟(4.1.1)中的interface,在該類中,封裝私有element對應(yīng)在dom樹上的dom節(jié)點(diǎn)對象,并利用改對象實(shí)現(xiàn)interface屮盧明的所^'函數(shù)功能。步驟(4.1.3)把生成的代碼寫出到文件,生成源代碼文件步驟(4.2)對于data—cache—中的每一個(gè)對象,利用JaxMEJavaSource提供的API生成與xml中datatype對應(yīng)的interface以及實(shí)現(xiàn)類。步驟(4.2.1)設(shè)置interface的訪問級(jí)別為public并在其中加入方法的聲明;添加對于該interface得注釋信息用于將來生成javadoc文件;對十取值定義為枚舉類型具有枚舉類型屬性(attribute)的datatype,在interface中定義與枚舉類型相對應(yīng)的公有靜態(tài)成員變量以及相關(guān)注釋信息;在interface中聲明用于操作類型為該datatype的element所有方法原型,并添加關(guān)于方法的注釋。如果該datatype在schema中定義為abstract,生成的interface也設(shè)置為abstract。如果該datatype是從其他數(shù)據(jù)類型約束(restriction)或擴(kuò)展(extension)而來,則為該interface添力口與父interface的繼承關(guān)系。步驟(4.2.2)生成類實(shí)現(xiàn)歩驟(4.1.1)中的interface,在該類中,封裝私有element對應(yīng)在dom樹上的dom節(jié)點(diǎn)對象,并利用該對象實(shí)現(xiàn)intorface巾盧明的所打函數(shù)功能。步驟(4.2.3)把生成的代碼寫出到文件,生成源代碼文件步驟(5)添加頂層工廠類、編譯、打包在Java代碼生成完成后,原始代碼并不能作為最終的代碼為開發(fā)人員所用,必須添加一部分手寫的頂層工廠類等手工代碼后進(jìn)行編譯,最終封裝成一個(gè)JAR二進(jìn)制包作為發(fā)行包提供給開發(fā)人員使用。步驟(5.1)在API頂層添加APIFactory類中,實(shí)現(xiàn)new,parse和save等方法,以提供新建稿件,從指定XML稿件讀入稿件并解析為API中提供的Java對象,以及把修改后的java對象保存為XML稿件等功能。在進(jìn)行解析時(shí),通過調(diào)用第三方(dom4j)的xm]解析器,并把處在xml最頂層的元素所對應(yīng)的dom結(jié)點(diǎn)作為私有變量封裝在API中為頂層元素生成的對象中。步驟(5.2)使用開源工具Ant提供的API,來調(diào)用Ant完成源代碼的編譯,打包及其javadoc等文檔的生成。最終得到提供給開發(fā)人員使用的是二進(jìn)制的APIJar包以及javadoc說明文檔。這樣的技術(shù)方案,其最大的好處有以下四點(diǎn)(1).使用中間配置文件弱化了生成的API目標(biāo)代碼與原始XMLSchema規(guī)范之間的緊密耦合,從而使得標(biāo)準(zhǔn)維護(hù)人員在原始設(shè)計(jì)允許的范圍之內(nèi),通過手工修改中間配置文件來修改最終生成代碼的業(yè)務(wù)接口和業(yè)務(wù)邏輯。(2).中間配置文件為多語種的標(biāo)準(zhǔn)API生成提供了條件,中間配置文件中規(guī)定了生成代碼的接口和功能,從而使得多語種的API有了公共的棊礎(chǔ),從而可以統(tǒng)一多語種API的函數(shù)接口,降低API的學(xué)習(xí)成本。(3).在類中封裝Dom結(jié)點(diǎn)的方法進(jìn)行數(shù)據(jù)操作,可以直接使用目前現(xiàn)成的成熟的XMLDOM解析器,而無需自己實(shí)現(xiàn)對XML稿件的Dom解析,既減少了工作量,而且對于成熟代碼的復(fù)用也會(huì)降低系統(tǒng)出錯(cuò)的概率。(4).使用在Java類中封裝Dom結(jié)點(diǎn)的方法,可以把對結(jié)點(diǎn)的操作與數(shù)據(jù)在物理上分開,又保持了其在邏輯上的依附性。同時(shí),也解決了許多Schema結(jié)構(gòu)在Java中沒有對應(yīng)數(shù)據(jù)結(jié)構(gòu)的問題。本文所采用的自動(dòng)生成XML數(shù)據(jù)綁定API的方法已經(jīng)應(yīng)用于CNML中文新聞置標(biāo)語g標(biāo)準(zhǔn)管理系統(tǒng)中。在實(shí)際的測試中,自動(dòng)生成的API具有健壯、穩(wěn)定等特點(diǎn),同時(shí)其執(zhí)行效率也滿足要求。C畫L標(biāo)準(zhǔn)幾次簡單改動(dòng),使用這種方法實(shí)現(xiàn)的系統(tǒng)幾乎可以不用更改任何代碼而重新生成符合要求的APT,具有很大的靈活性。該方法包括如下步驟(1)對xmlschema進(jìn)行語法解析和邏輯解析(1.1)語法解析,記錄所有在schema中定義的datatype,并單獨(dú)記錄abstract屬性為true的datatype。(1.2)對schema進(jìn)行邏輯解析,通過解析對于Schema中定義的兀素、數(shù)據(jù)類型分別生成SchemaElement和Sche腿DataType類型的對象,并在其中記錄與Schema相關(guān)的所有信息。具體記錄的信息見表1和表2<table>tableseeoriginaldocumentpage13</column></row><table><table>tableseeoriginaldocumentpage14</column></row><table>表2.SchemaDataType中記錄Schema信息詳單<table>tableseeoriginaldocumentpage14</column></row><table><table>tableseeoriginaldocumentpage15</column></row><table>(2)接口映射。根據(jù)SchemaDataType和SchemaElement對象中記錄的信息,通過接口映射,生成目標(biāo)代碼中每個(gè)類以及類中成員函數(shù)的接口信息,從而生成DataTypeObject和NodeObject實(shí)體描述對象。這一步是生成默認(rèn)中間代碼層的關(guān)鍵步驟,如果不對中間配置文件進(jìn)行修改的話,這一步將決定生成的目標(biāo)代碼中各個(gè)element和datatype所對應(yīng)的類以及類中靜態(tài)成員變量的變量名、取值,以及各個(gè)成員函數(shù)的函數(shù)名,函數(shù)原型以及函數(shù)所進(jìn)行的功能等??偠灾诮涌谟成洳襟E中將完成從基本的Schema節(jié)點(diǎn)描述信息到對其進(jìn)行操作訪問的API接口之間的映射。(2.1)映射規(guī)則考慮到這兩種映射對象之間的相似性,由于SchemaDataType會(huì)涉及更為復(fù)雜的接口映射關(guān)系。對于SchemaElement的映射處理可以看作是其一個(gè)子集。所以表3給出了Schema源信息和函數(shù)接口之間的對照。表3.Schema源信息到映射目標(biāo)對照<table>tableseeoriginaldocumentpage15</column></row><table><table>tableseeoriginaldocumentpage16</column></row><table>在給出如上的映射元和映射目標(biāo)之后,還需要定義一套結(jié)點(diǎn)描述與接口之間的映射關(guān)系。(2.1.1)基本映射這里以對于元素或?qū)傩詢?nèi)容的一些基本操作接口的映射規(guī)則為例,其具體描述如下(a).對于元素屬性數(shù)據(jù),提供setXXXAttr和getXXXAUr方法。(b).對于包含文字結(jié)點(diǎn)的元素,如果maxOccur都為1,提供setText、getText方法。(c).對于包含子元素的元素或者數(shù)據(jù)類型,如果子元素的minOccur和max0ccur都為1,則提供addXXX、getXXX、removeXXX等方法,如果子元素包含文字結(jié)點(diǎn),則還要提供setXXXTert、getXXXText等方法。如果子元素的max0ccur為大于1,則除了添加上述方法外,還要依情況添加getXXXList、getXXXTextList等方法。(2.2.2)特有映射在映射過程中,針對XML特有操作,處理過程中包含一些對于特殊操作接口的使用,所以需要為標(biāo)準(zhǔn)API系統(tǒng)添加一些額外的操作接口映射關(guān)系。它們一般都是以一種附加的形式連同其他操作接口一同給出的(a).XPath數(shù)據(jù)訪問接口為所有的屬性、元素和類型定義添加getNodeByXPath和getValueByXPath方法。以實(shí)現(xiàn)在具體業(yè)務(wù)需求中對于數(shù)據(jù)信息方便快速的訪問要求。(b).特殊類型數(shù)據(jù)設(shè)置與訪問接口為所有的元素添加setCDATAText、hasCDATA、asXML、setXML、getXML、getXMLText方法。這是考慮到具體業(yè)務(wù)需求中可能包含很多對于HTML格式數(shù)據(jù)內(nèi)容和CDATA格式數(shù)據(jù)內(nèi)容的操作,通過增加這些直接數(shù)據(jù)訪問接口可以簡化在實(shí)際使用過程中的處理過程。(c).為包含有通過正規(guī)表達(dá)式對其格式進(jìn)行約束的元素,添加vaiidateType方法,用于檢査該元素是否符合Schema中有正則表達(dá)式所約束的類型。(d).對于有多種子類型的數(shù)據(jù)類型定義,由于在添加過程中需要指定以某種子類型作為添加數(shù)據(jù)。提供addXXXOfYYYType方法(2.2)把完成接口映射生成的接口對象保存成XML中間配置文件,用戶可以按照自己的需求相應(yīng)修改中間配置文件,從而達(dá)到對生成目標(biāo)代碼的個(gè)性化。在配置文件中,記錄NodeObject和DataTypeObject對象中的所有私有成員變量及其值。配置文件是以xml文件的形式記錄的。在中間配置xml文件中,除了對應(yīng)于schema中元素和類型的定義中所定義的屬性、子元素列表以及必要的描述信息的記錄外,最重要的是對生成函數(shù)接口的記錄。表4給出了對于每個(gè)函數(shù)進(jìn)行記錄的xm]結(jié)點(diǎn)定義。表4.NodeMethod元素中子元素與屬性介紹<table>tableseeoriginaldocumentpage17</column></row><table>在其內(nèi)包含可重復(fù)出現(xiàn)多次的Arg于元素,Arg子元素包括naine、type屬性以及Comment子元素,在其中記錄函數(shù)參數(shù)的名稱,類型以及對于函數(shù)參數(shù)的注釋<table>tableseeoriginaldocumentpage18</column></row><table>(3)讀入修改后的配置文件這一歩驟中,利用dom4j提供的xml解析器,讀入配置文件,并根據(jù)配置文件在內(nèi)存中生成分另ij為datatype禾口element生成DataTypeObject禾口NodeObjectX寸象在用戶不需要修改默認(rèn)配置文件的情況下,這一步驟可以省略,因?yàn)閮?nèi)存中存在的DataTypeObject和NodeObject對象其實(shí)和從配置文件中生成的對象是等同的。這一歩驟的好處不但為用戶定制API接口提供了基礎(chǔ),而且也是實(shí)現(xiàn)多語言API生成的甜提條件。對于多語言API的生成,不同語言在此前的步驟是完全一樣的;從這一步驟丌始起,針對不同的程序設(shè)計(jì)語言,添加不同的代碼生成程序(引擎),就可以生成接口一致的多種語幽—版本的API。(4)使用代碼生成引擎,生成API源代碼。依照配置文件,為操作element和datatype生成相應(yīng)的接口及其實(shí)現(xiàn)類。在生成的接口中,主要定義用于操作該節(jié)點(diǎn)對象的所有方法聲明(方法原型)以及類、方法、方法參數(shù)等的注釋,注釋用于生成用戶手冊。實(shí)現(xiàn)類用于實(shí)現(xiàn)該類對應(yīng)的接口,主要用來實(shí)現(xiàn)接口中定義的函數(shù),封裝必要的數(shù)據(jù)結(jié)構(gòu)等。在每個(gè)具體的實(shí)現(xiàn)類中,不封裝具體的數(shù)據(jù),而只是把該類對應(yīng)的扁l元素在dora樹上的d咖節(jié)點(diǎn)對象作為私有變量封裝在類中。類屮對于該元素的所有操作都是調(diào)用該dom節(jié)點(diǎn)中相應(yīng)的函數(shù)來實(shí)現(xiàn)的。以下給出了幾種典型的函數(shù)具體的實(shí)現(xiàn)方法。(4.1)get、set文本信息的函數(shù)這一類函數(shù)包括獲得屬性值,元素文本或者子元素文本值等。在這一類方法中,首先,以該方法對象中NodeMethod記錄的XPath為輸入,通過調(diào)用封裝在類中的dom節(jié)點(diǎn)的selectSingleNode函數(shù)得到相應(yīng)的節(jié)點(diǎn)dom對象。然后,通過調(diào)用該節(jié)點(diǎn)對象的getText方法得到需要獲得的文本值。最后,把獲得的文本值作為函數(shù)返回值返回。(4.2)get元素對象的函數(shù)這一類的函數(shù)包括獲得子元素對象,所有子元素列表等方法。在這類方法中,首先,同樣通過XPath值得到相應(yīng)的節(jié)點(diǎn)dom對象。然后,調(diào)用在API中為該元素定義的類的構(gòu)造函數(shù),構(gòu)建一個(gè)新的對象,并把該dom對象賦值給新構(gòu)建對象的domNode私有變量域。最后,把該對象以接口對象的形式作為函數(shù)返回值返回。如果是返回多個(gè)對象的列表,則新建一個(gè)列表對象,把新生成的元素對象加入到列表中,最終把列表對象返回。(4.3)remove函數(shù)這--類函數(shù)主要包括刪除屬性、子元素或者指定的重復(fù)出現(xiàn)的子元素中的某個(gè)等。同樣通過XPath值得到相應(yīng)的節(jié)點(diǎn)dom對象。如果該dom對象不為空,則通過該dom對象調(diào)用detach方法將該對象從dom樹上摘下。其他的方法基本都是在這三類方法的基礎(chǔ)上,在源代碼中附加具體的處理邏輯進(jìn)行處理,然后返回相應(yīng)的結(jié)果。例如,setContentCDATA等方法中,需要加入CDATA節(jié)點(diǎn),直接使用添加text的方法就會(huì)出現(xiàn)問題。就需要使用到dom4j提供的DocumentHelper類中提供的createCDATA方法先創(chuàng)建一個(gè)CDATA類型節(jié)點(diǎn)對象,然后通過調(diào)用domNodc中的addContent方法把生成的CDATA節(jié)點(diǎn)添加進(jìn)去。(5)添加頂層工廠類、編譯、打包生成的代碼(5.1)添加頂層工廠類通過如上歩驟所生成的API目標(biāo)代碼,并不能直接提供給終端用戶所使用。其原因在于生成的API代碼中在創(chuàng)建最頂層元素對象時(shí)會(huì)涉及對于dom4j中domNode節(jié)點(diǎn)信息的獲取和設(shè)置等工作,這對于一般的應(yīng)用程序員而言將是十分麻煩的事情,也容易產(chǎn)生山子程序員個(gè)人失誤而導(dǎo)致API不能正常工作情況的發(fā)生。另外通過所生成的API目標(biāo)代碼并不能完成存儲(chǔ)當(dāng)前XML文檔內(nèi)容或新建一個(gè)XML文檔等操作要求。所以需要額外的添加操作代碼來實(shí)現(xiàn)這些功能??紤]到設(shè)計(jì)模式中Factory應(yīng)用模式的相關(guān)特性,將通過為用戶提供一個(gè)簡介的Factory類,并為用戶提供如下統(tǒng)一的API操作接口的解決方法parse:利用dom4j中的SAXReader解析一個(gè)由文件路徑字符串所指定外部XML稿件。并返回一個(gè)表示這個(gè)XML外部稿件的頂層數(shù)據(jù)對象。這主要通過完成對doiriNode節(jié)點(diǎn)信息的設(shè)置。save:將當(dāng)前代表XML文件內(nèi)容的數(shù)據(jù)對象中的所有信息,保存到一個(gè)指定的外部XML文件。完成對于一個(gè)XML文件的存儲(chǔ)工作。new:返回一個(gè)新的XML文件對象,并只為其設(shè)置單一的頂層元素標(biāo)簽內(nèi)容。用于用戶作后期的擴(kuò)展和對內(nèi)容的添加。這樣終端用戶在使用過程中只要通過Factory類所提供的getlnstance方法就可以得到如上所敘述的一個(gè)標(biāo)準(zhǔn)JavaAPI操作接口對象。(5.2)編譯、打包作為發(fā)布的API代碼,不能直接以源碼形式提供給最終用戶,而需要提供給用戶編譯完成后的二進(jìn)制代碼包,以方便用戶使用。編譯和打包的工作,這里使用Apache基金開源項(xiàng)目Ant所提供的API,來調(diào)用Ant完成代碼的編譯,打包以及javadoc等說明文檔的生成。最終提供給開發(fā)人員使用的是二進(jìn)制的APIJar包以及javadoc說明文檔。<table>tableseeoriginaldocumentpage20</column></row><table>利用上述步驟(1)一(5),創(chuàng)建了-個(gè)從xmlschema文件生成用于操作符和該schema描述的xml文件的數(shù)據(jù)綁定API生成系統(tǒng)。本發(fā)明所有實(shí)驗(yàn)用Java編程實(shí)現(xiàn),并在在CPU為P41.7GHz,內(nèi)存為512MB,硬盤轉(zhuǎn)速為5400轉(zhuǎn)的個(gè)人計(jì)算機(jī)平臺(tái)上運(yùn)行并進(jìn)行測試。(1)xmlschema及其xml文件使用本系統(tǒng),由CNML標(biāo)準(zhǔn)(中文新聞置標(biāo)語言)描述的Schema文檔(3480多行)生成用于對CNML稿件進(jìn)行操作的API代碼,并使用新華社標(biāo)準(zhǔn)稿件模板(1570多行)對生成的API進(jìn)行測試,測試內(nèi)容除了正確性之外,還對API的效率等進(jìn)行測試。從讀入Schema文件到配置文件的生成耗時(shí)15秒,從配置文件生成Java代碼耗時(shí)20秒,編譯、打包和生成javadoc文檔耗時(shí)125秒。一共解析生成369個(gè)類,其中最大的類的實(shí)現(xiàn)類有2700多行,357個(gè)方法;最小的類的實(shí)現(xiàn)類有100行,6個(gè)方法。生成的API性能測試如表2所示(2)生成方法實(shí)施1)生成配置文件根據(jù)本發(fā)明的方法,使用CNMLSchema作為輸入,共生成373個(gè)配置文件,其中為element生成的文件263個(gè),datatype生成的文件110個(gè)。2)代碼生成以生成的373個(gè)配置文件作為輸入,共生成746個(gè)類和接口,在生成的類中,其中最大的實(shí)現(xiàn)類有2700多行代碼,357個(gè)方法;最小的實(shí)現(xiàn)類中只有100行代碼,6個(gè)方法。3)代碼編譯和打包對于生成的源代碼,使用Ant調(diào)用編譯器進(jìn)行編譯,最終生成xml-api.jar二進(jìn)制包。同時(shí)通用javadoc提取源代碼中的注釋信息生成API的說明文檔,其格式為html格式。(3)實(shí)驗(yàn)衡量的準(zhǔn)則我們主要以完成某項(xiàng)測試的時(shí)間作為效率測試的標(biāo)準(zhǔn)。對于耗時(shí)比較少的操作,我們釆用循環(huán)進(jìn)行測試ioooo次的方法進(jìn)行測量,最終把單次平均時(shí)間作為操作的測試時(shí)間記錄下來。(4)實(shí)驗(yàn)結(jié)果我們首先對生成API整個(gè)過程進(jìn)行效率測試,其結(jié)果如下從讀入Schema文件到配置文件的生成耗時(shí)15秒,從配置文件生成java代碼耗時(shí)20秒,編譯、打包和生成javadoc文檔耗時(shí)125秒。其次,對于所生成的API對于XML稿件進(jìn)行操作的效率進(jìn)行測試。我們在這里測試了幾種常用的函數(shù)的運(yùn)行時(shí)間,并把其記錄在表6中。表6CNML標(biāo)準(zhǔn)API性能測試單位毫秒(ms<table>tableseeoriginaldocumentpage21</column></row><table>其中,parse速度是指從一個(gè)xml稿件解析成API中所定義的對象所需要的時(shí)間。save速度是指把xml稿件的內(nèi)存對象保存成xml文件所花費(fèi)的時(shí)間。get方法主要是測試通過API獲取xml某個(gè)element結(jié)點(diǎn)值所花費(fèi)的時(shí)間。Set方法是測試通過API所提供的方法設(shè)置某個(gè)element節(jié)點(diǎn)值所花費(fèi)的時(shí)間。add方法是指在指定的節(jié)點(diǎn)下,添加一個(gè)給定值的節(jié)點(diǎn)所花費(fèi)的時(shí)間。XPath方法是指通過XPath獲取節(jié)點(diǎn)和節(jié)點(diǎn)值等操作所耗費(fèi)的時(shí)間。權(quán)利要求1、基于XML模式的數(shù)據(jù)綁定應(yīng)用程序接口生成方法,其特征在于所述方法是在計(jì)算機(jī)中依次按以下步驟實(shí)現(xiàn)的步驟(1),使用JaxMeXS解析器,對輸入到計(jì)算機(jī)中的XMLSchema模式做語法解析和邏輯解析,生成SchemaElement和SchemaDataType類型的對象,在其中記錄與Schema相關(guān)的所有信息,其中至少包括子元素列表,屬性列表以及父類型名稱;步驟(1.1),語法解析記錄所有在Schema中定義的數(shù)據(jù)類型datatype,存入到syntax_map中,并單獨(dú)記錄abstract屬性為true的datatype,存入到abstract_map中;步驟(1.2),邏輯解析對Schema進(jìn)行邏輯解析,對于其中定義的元素、數(shù)據(jù)類型分別生成SchemaElement和SchemaDataType類型的對象,并在其中記錄與Schema相關(guān)的所有信息,各自形成一個(gè)信息詳單,數(shù)據(jù)項(xiàng)中至少含有子結(jié)點(diǎn)名、類型以及約束信息;對于所有的element,在所述記錄信息中,包含有根據(jù)Schema中定義來設(shè)置的SchemaElement對象成員變量或成員變量值,以及生成代碼所需的所有Schema信息,并把生成的對象添加到_element列表中;對于所有的數(shù)據(jù)類型datatype,在所述記錄信息中,除了根據(jù)schema中的定義設(shè)置的成員變量或成員變量值以及生成代碼所需的所有schema信息外,當(dāng)該datatype是通過其他數(shù)據(jù)類型經(jīng)過擴(kuò)展或者約束修飾而來,則要在parent_map中記錄兩種數(shù)據(jù)類型之間的繼承關(guān)系,即被擴(kuò)展或約束的類型為本類型的父類型,并把生成的對象添加到_datatype列表;所屬子元素列表至少包含子元素名稱、類型、以及允許出現(xiàn)次數(shù);步驟(2),接口映射,根據(jù)SchemaDataType和SchemaElement對象中記錄的信息,按以下步驟,通過接口映射生成目標(biāo)代碼中每個(gè)類以及類中成員變量的接口信息生成DataTypeObject和NodeObject實(shí)體描述對象,以完成從結(jié)點(diǎn)的Schema到對該結(jié)點(diǎn)進(jìn)行操作訪問的應(yīng)用程序接口API操作接口之間的映射步驟(2.1),建立一個(gè)Schema描述信息到API操作接口的對照表,所述API操作接口包括讀、寫、管理以及特有操作接口CNML,在所述對照表中,包括以下兩種映射關(guān)系基本映射關(guān)系,是對元素或?qū)傩詢?nèi)容的一些基本操作接口的映射規(guī)則,其中包括以下五種關(guān)系對于元素屬性數(shù)據(jù),提供以下兩種API操作接口setXXXAttr,設(shè)置元素某一屬性值,getXXXAttr,獲得元素某一屬性值,對于包含有文本內(nèi)容的元素,當(dāng)出現(xiàn)次數(shù)maxOccur為1時(shí),提供以下兩種操作接口setText,設(shè)置元素的文本內(nèi)容,getText,獲取元素的文本內(nèi)容,對于包含子元素的元素或者數(shù)據(jù)類型,當(dāng)出現(xiàn)minOccur和maxOccur都為1時(shí),提供以下幾種操作接口addXXX,添加XXX子元素,getXXX,獲得XXX子元素,removeXXX,刪除XXX子元素,當(dāng)子元素包含文字結(jié)點(diǎn)時(shí),提供以下操作接口setXXXText,設(shè)置當(dāng)前元素下XXX子元素中包含的文本內(nèi)容,getXXXText,獲取當(dāng)前元素下XXX子元素中包含的文本內(nèi)容,對于包含的子元素中出現(xiàn)maxOccur大于1時(shí),提供以下幾種操作接口addXXX,添加XXX子元素,getXXXintindex,獲得由索引index所指示的XXX子元素,int是Java內(nèi)置整型數(shù)據(jù)類型,removeXXXintindex,刪除由索引index所知是的XXX子元素,getXXXTextintindex,獲得由索引index所指示的XXX子元素文本內(nèi)容,setXXXTextintindex,設(shè)置由索引index所指示的XXX子元素文本內(nèi)容,getXXXList,獲得當(dāng)前元素下所有XXX子元素的列表,getXXXTextList,獲得當(dāng)前元素下所有XXX子元素文本內(nèi)容的列表,特有映射針對所述XML特有操作接口,以一種附加的形式連同基本操作接口同時(shí)給出,包括以下四種XPath數(shù)據(jù)訪問接口為所有的屬性、元素和類型定義添加getNodeByXPath,getNodesByXPath以及getValueByXPath特有操作接口,其中g(shù)etNodeByXPath為根據(jù)指定的XPath獲得相應(yīng)結(jié)點(diǎn)對象,getNodesByXPath為根據(jù)指定的XPath獲得相應(yīng)結(jié)點(diǎn)對象列表,getValueByXPath為根據(jù)指定的XPath獲得其對應(yīng)的第一個(gè)結(jié)點(diǎn)對象的文本內(nèi)容,特殊類型數(shù)據(jù)設(shè)置與訪問接口,針對元素文本內(nèi)容可能為HTML格式數(shù)據(jù)內(nèi)容或CDATA格式數(shù)據(jù)內(nèi)容,為所有元素添加以下接口setCDATAText為當(dāng)前元素設(shè)置CDATA格式的文本內(nèi)容,hasCDATAText判斷當(dāng)前元素是否含有CDATA格式的文本內(nèi)容,asXML獲取當(dāng)前元素內(nèi)部所有元素、屬性等的XML文本,并包含當(dāng)前元素的標(biāo)簽,getXML獲取當(dāng)前元素內(nèi)部所有元素、屬性等的XML文本,不包含當(dāng)前元素的標(biāo)簽,getXMLText獲取當(dāng)前元素內(nèi)部所有元素、屬性等的XML文本,并去掉其間所有的XML標(biāo)簽,對于Schema中通過正則表達(dá)式對其文本內(nèi)容進(jìn)行格式約束的元素,添加validateType方法,用于檢驗(yàn)所當(dāng)前元素所包含的文本內(nèi)容是否符合類型定義中正則表達(dá)式的限制;對于有多種子類型的數(shù)據(jù)類型定義,提供addXXXofYYYType操作接口,用一個(gè)YYY的實(shí)例來添加為當(dāng)前元素的XXX子元素;步驟(2.2),把步驟(2.1)中完成接口映射生成的接口對象保存成XML中間配置文件,供用戶修改該中間配置文件,實(shí)現(xiàn)生成目標(biāo)代碼的個(gè)性化步驟(2.2.1),依次從_datatype列表中取出SchemaDataType對象,依據(jù)該對象中的成員變量值以及預(yù)先如上定義的接口映射規(guī)則為其生成一個(gè)DataTypeObject類對象,在該對象的列表中加入為每個(gè)操作接口生成的NodeMethod對象,把生成的DataTypeObject加入到data_cache_中,所述的NodeMethod對象是依據(jù)上述映射規(guī)則生成的一個(gè)用來對datatype所定義的XML元素進(jìn)行操作的函數(shù)接口描述,其中會(huì)有以下數(shù)據(jù)項(xiàng)name用來記錄所需生成函數(shù)的函數(shù)名稱,isAttributeMethod用來記錄是否是對某個(gè)元素屬性進(jìn)行操作的函數(shù),MethodReturn用來記錄所需生成函數(shù),Arguments記錄生成函數(shù)的參數(shù)信息,MethodAction記錄生成函數(shù)的函數(shù)體實(shí)際所需提供的操作信息,步驟(2.2.2),依據(jù)步驟(1.2)中生成的parent_map中的繼承關(guān)系,為相應(yīng)的兩個(gè)datatype所對應(yīng)的DataTypeObject對象加入依賴關(guān)系;步驟(2.2.3),依次從_element列表中取出SchemaElement對象,依據(jù)該對象中的成員變量值為其生成一個(gè)NodeObject類,并在NodeObject類中相應(yīng)列表中加入NodeMethod對象,用以記錄需要生成的成員函數(shù)接口描述,并把生成的NodeObject加入到cache_中;步驟(2.2.4),把所得到的cache_和data_cache_中的對象保存成xml形式——配置文件,作為中間代碼備用,供用戶修改,實(shí)現(xiàn)API操作接口的定制;步驟(3),從XML中間代碼讀入步驟(2.2.4)所述經(jīng)過用戶修改的中間層配置文件,然后在內(nèi)存中生成DataTypeObject和NodeObject的對象,分別相應(yīng)的保存到data_cache_和cache_中;步驟(4),針對不同的程序設(shè)計(jì)語言,使用代碼生成程序,生成API源代碼步驟(4.1),對于cache_中的每一個(gè)對象,利用相應(yīng)的程序設(shè)計(jì)語言代碼生成程序,生成用于操作xml文件中element的interface以及實(shí)現(xiàn)類,所述的實(shí)現(xiàn)類是指用于實(shí)現(xiàn)該類的對應(yīng)的接口中定義的接口interface中定義的接口函數(shù),在每個(gè)具體的實(shí)現(xiàn)類中要把該類對應(yīng)的XML元素在dom樹上的dom結(jié)點(diǎn)對象作為私有變量封裝在該類中,類中對于該元素的操作要調(diào)用該dom節(jié)點(diǎn)中相應(yīng)的函數(shù)來實(shí)現(xiàn);步驟(4.2),對于data_cache_中的每一個(gè)對象,用所述步驟(4.1)的方法來生成用于操作xml文件中datatype所定義的元素的接口以及實(shí)現(xiàn)類;但是,若該datatype在schema中定義為abstract,則生成的接口也設(shè)置為abstract,若該datatype是從其他數(shù)據(jù)類型約束或擴(kuò)展而來,則為該接口添加與父接口的繼承關(guān)系;步驟(4.3),把步驟(4.1)或步驟(4.2)生成的代碼寫出到文件,生成源代碼文件;步驟(5),添加頂層工廠類、編譯并打包所生成的代碼文件,以封裝成一個(gè)二進(jìn)制包作為發(fā)行包以供用戶使用步驟(5.1),在所述API頂層添加APIFactory類,為用戶提供統(tǒng)一的操作入口;步驟(5.2),使用開源工具Ant提供的API,調(diào)用API完成包括代碼文件的編譯,打包以及說明文檔的生成。全文摘要基于XML模式的數(shù)據(jù)綁定應(yīng)用程序接口生成方法針對實(shí)際中存在的復(fù)雜XMLschema規(guī)范,提出了一種自動(dòng)生成用于操作符合XMLSchema規(guī)范的XML文件的數(shù)據(jù)綁定API的方法。其特征為該方法以數(shù)據(jù)綁定技術(shù)為基礎(chǔ),首先生成一套與生成目標(biāo)語言類型無關(guān)的中間層,然后通過獨(dú)立的代碼生成引擎生成所需類型目標(biāo)代碼。本文基于新華社頒布的CNMLSchema(中文新聞置標(biāo)語言)以及CNML稿件模板進(jìn)行代碼生成和測試,實(shí)驗(yàn)證明,這種方法在保證API的健壯性和正確性的基礎(chǔ)上,同時(shí)具有了極大的靈活性,可以大幅降低schema規(guī)范變遷所帶來的API維護(hù)成本,保持多種語言API接口的基本一致性以降低培訓(xùn)成本,同時(shí)也為基于API之上的應(yīng)用系統(tǒng)提供穩(wěn)定的支持。文檔編號(hào)G06F17/30GK101339500SQ20081011227公開日2009年1月7日申請日期2008年5月22日優(yōu)先權(quán)日2008年5月22日發(fā)明者杰唐,鵬張,軍李,李涓子,峰王,陳德偉申請人:清華大學(xué)