国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      基于xml模式的數(shù)據(jù)綁定應(yīng)用程序接口生成方法

      文檔序號:6464109閱讀:157來源:國知局

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