專利名稱:用于對象模型與xml間轉(zhuǎn)換的可共享雙向方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及用于XML文檔到對象模型(反之亦然)轉(zhuǎn)換的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品。
背景技術(shù):
XML(可擴(kuò)展標(biāo)記語言)是一種獨(dú)立于平臺(tái)的編程語言,由于它提供了用于創(chuàng)建公共信息格式以及共享網(wǎng)絡(luò)上不同軟件應(yīng)用的格式和數(shù)據(jù)的靈活機(jī)制,從而特別適于在諸如Internet的分布式網(wǎng)絡(luò)上使用。XML包括描述文件內(nèi)容的標(biāo)記符號(標(biāo)簽)。XML在標(biāo)記符號使用方法上同HTML(超文本標(biāo)記語言)相似,但與HTML相比,它至少具有兩個(gè)基本區(qū)別。首先,HTML具有定義標(biāo)記符號的專用集,而在XML中所允許標(biāo)記符號是不受限和自定義的,從而XML是可擴(kuò)展的。即,盡管XML也具有標(biāo)準(zhǔn)化標(biāo)記符號,但XML程序員并不受定義標(biāo)記符號標(biāo)準(zhǔn)集的限制,而是能夠定義出新的標(biāo)記符號。其次,由于HTML標(biāo)簽和屬性僅定義出如何顯示實(shí)際內(nèi)容,使HTML受限,但XML標(biāo)簽和屬性既能夠定義如何顯示信息(例如,通過Web瀏覽器),又能夠定義顯示什么樣的內(nèi)容。在本說明書中,假設(shè)讀者基本熟悉XML。
由于其靈活性和可讀性,XML通常用作為對象模型的串行化機(jī)制。也就是說,程序員能夠定義XML標(biāo)記符號以與某種類型的數(shù)據(jù)相對應(yīng),然后創(chuàng)建XML文件(XML文件也稱為XML文檔或XML頁),可對XML文件進(jìn)行轉(zhuǎn)換,以提供與標(biāo)簽和屬性相關(guān)聯(lián)的內(nèi)容。例如,如果程序員想要建立描述某類產(chǎn)品的標(biāo)準(zhǔn)格式,以便能在不同平臺(tái)的多個(gè)應(yīng)用上共享該類產(chǎn)品的描述,程序員可定義與該產(chǎn)品相對應(yīng)的通用標(biāo)簽,例如,“SHIRT(襯衫)”,以及該標(biāo)簽的屬性,每個(gè)屬性定義了該產(chǎn)品的特性,例如,“SIZE(尺寸)”屬性、“COLOR(顏色)”屬性、“MATERIAL(材料)”屬性、“COST(價(jià)格)”屬性等。屬性字段中提供有實(shí)際數(shù)據(jù)內(nèi)容,例如,large(大號)、red and blue stripes(紅藍(lán)條紋)、cotton(棉)、$29.95等。然后可在網(wǎng)絡(luò)上將關(guān)于該產(chǎn)品的數(shù)據(jù)(數(shù)據(jù)內(nèi)容)以獨(dú)立于平臺(tái)的XML頁的形式發(fā)送到運(yùn)行XML解釋器程序的任何其他計(jì)算機(jī)上,XML解釋器程序被編程為轉(zhuǎn)換和理解這些特定標(biāo)簽。
使用面向?qū)ο蠹夹g(shù)開發(fā)的應(yīng)用軟件程序通常是基于底層“對象模型”。對象模型是描述系統(tǒng)數(shù)據(jù)和行為的有關(guān)“對象”的集合。對象通常描述真實(shí)世界的實(shí)體。例如,名為“Address(地址)”的對象可具有名為“Street(街道)”、“City(城市)”等的屬性以及名為“getStreet()”、“getCity()”的方法或函數(shù)。在良好構(gòu)建的軟件系統(tǒng)中,將底層對象模型設(shè)計(jì)為獨(dú)立于系統(tǒng)中其他服務(wù),例如傳輸機(jī)制,用戶界面,數(shù)據(jù)存儲(chǔ)等的層。按照這樣的方式,對象模型成為可為其他應(yīng)用所包含在內(nèi)的可重用組件。
在使用XML的應(yīng)用中,慣用的做法是將XML文檔中所包含的數(shù)據(jù)模型化為對象模型。相反地,通常存在現(xiàn)有對象模型并使用XML作為串行化格式。例如,將具有標(biāo)簽<address>/<address>的XML實(shí)體模型化為對象名“Address”。從而,其他應(yīng)用組件(例如,用戶界面)的代碼可與對象模型中的對象交互,但不與底層XML交互。這提供了將系統(tǒng)中數(shù)據(jù)的含義與讀出和寫入XML的實(shí)際機(jī)制相隔離的較好抽象層。從而,在系統(tǒng)中會(huì)存在將對象模型轉(zhuǎn)換到XML(反之亦然)的層。在某些情形中,XML中的數(shù)據(jù)元素以簡單而直接的方式映射到對象模型中的值,正如在以上示例的。然而,通常的情形是,映射并不簡單,且存在復(fù)雜的規(guī)則,以便進(jìn)行轉(zhuǎn)換。
一般而言,將XML文檔轉(zhuǎn)換成對象模型的過程涉及到三個(gè)基本步驟。第一,分析XML文本中的每個(gè)字符,以識(shí)別“合法”的XML標(biāo)識(shí)(token),諸如開始標(biāo)簽,屬性,結(jié)束標(biāo)簽,和CDATA節(jié)。第二,分析標(biāo)識(shí),以驗(yàn)證它們形成合法的XML結(jié)構(gòu)(例如,所有標(biāo)簽具有匹配的打開和關(guān)閉標(biāo)簽)。最后,在翻譯過程中,因此將XML文檔中包含的數(shù)據(jù)相應(yīng)轉(zhuǎn)換為屬于對象模型和集合的數(shù)據(jù)元素和對象。數(shù)據(jù)元素可表示對象模型或其他對象中的簡單屬性。例如,“地址(address)”具有“城市(city)”,其為簡單屬性。“雇員(employee)”具有“地址(Address)”,其為表示對象模型中另一對象的復(fù)雜類型。通常能夠?qū)⒌刂?Address)的屬性和雇員(Employee)與地址(Address)之間的對象關(guān)聯(lián)稱為“結(jié)構(gòu)特征”或簡單的稱之為“特征”。
當(dāng)應(yīng)用程序(例如,XML編輯器)接收XML文檔時(shí),執(zhí)行數(shù)個(gè)步驟,以便將該XML文檔轉(zhuǎn)換成在用戶計(jì)算機(jī)顯示器上的顯示(呈現(xiàn))頁。在一個(gè)眾知的方案中,首先,打開和解析XML文檔,以構(gòu)建包含有數(shù)據(jù)的文檔對象模型(DOM)。DOM為萬維網(wǎng)協(xié)會(huì)(W3C)開發(fā)的編程接口規(guī)范,它使得程序員將HTML和XML文件視作程序?qū)ο髞磉M(jìn)行創(chuàng)建和編輯。W3C最近頒布了DOM第2級規(guī)范,在此將其引作參考。DOM基本為XML文件的樹形數(shù)據(jù)結(jié)構(gòu)表示,其中,樹的每個(gè)節(jié)點(diǎn)為XML元素,例如,標(biāo)簽、屬性、值等。生成DOM后,對其遍歷,以創(chuàng)建對象模型。對于要將XML頁轉(zhuǎn)換到顯示的情形,對象模型即為直接呈現(xiàn)邏輯顯示的模型。從而,可將呈現(xiàn)XML頁的處理視為包括四個(gè)步驟(1)XML文檔步驟,(2)文檔對象模型步驟,(3)對象模型步驟,和(4)實(shí)際顯示步驟。
也存在有應(yīng)用需讀取XML文檔內(nèi)容并填充對象模型的其他情形,其中,并非出于編輯或圖形顯示的目的,而是為了使用包含在其中的數(shù)據(jù)進(jìn)行進(jìn)一步的處理。一種示例為J2EE(Sun Microsystems)應(yīng)用服務(wù)器,該服務(wù)器為在網(wǎng)絡(luò)上配置應(yīng)用而載入XML“配置描述符”。在許多情形中,特別是對于啟動(dòng)應(yīng)用服務(wù)器,以只讀方式載入XML文檔;其內(nèi)容將不再被改變。此外,在這些類型的應(yīng)用中,性能很重要;速度和內(nèi)存占用(memory footprint)最為重要。在這些約束下,創(chuàng)建DOM模型添加了不必要的內(nèi)存和CPU要求。需要一種用于載入文檔并將其轉(zhuǎn)換到對象模型的不同方法。已存在有眾知的方法;一種常用的示例是用于XML的簡單API(SAX)。
如上所述,對象模型變成為可重用組件。經(jīng)常會(huì)出現(xiàn)相同的對象模型應(yīng)用于“工具”和“運(yùn)行時(shí)刻”應(yīng)用中的情形。工具應(yīng)用是用于對產(chǎn)品應(yīng)用(如,要在應(yīng)用服務(wù)器上配置的J2EE企業(yè)級應(yīng)用)所要使用的XML文件進(jìn)行創(chuàng)建、編輯和更新的應(yīng)用程序。運(yùn)行時(shí)刻應(yīng)用是這些產(chǎn)品的實(shí)際使用者;例如,J2EE應(yīng)用服務(wù)器本身。對工具應(yīng)用的要求與對運(yùn)行應(yīng)用的要求相比,存在較大的差異。
盡管工具應(yīng)用的速度需要快一些,但速度沒有便于使用重要。文件需以所見即所得(WYSIWYG)的格式得以呈現(xiàn),且更新至應(yīng)在對象模型中反映的文本,反之亦然。因此,使用用于載入和保存XML文檔的DOM方法,有益于工具應(yīng)用。如上所述,使用SAX或某些其他快速方法有益于運(yùn)行時(shí)刻應(yīng)用。在現(xiàn)有技術(shù)中,應(yīng)對要求中存在這樣差異的方法是,編寫用于載入和保存文檔,并從XML轉(zhuǎn)換至對象模型(反之亦然)的兩個(gè)獨(dú)立實(shí)現(xiàn)(一個(gè)用于DOM,另一個(gè)用于SAX),即使在兩個(gè)代碼集中可能存在公共模式也是如此。這樣做成本較高,且造成維護(hù)問題。在許多情形中,對于將XML翻譯成對象模型而言,存在非常復(fù)雜的規(guī)則,且將其實(shí)現(xiàn)的代碼基本處在兩個(gè)處境中。這大大增加了檢測投入,它可在工具和運(yùn)行程序之間留下細(xì)微的不一致性,從而使改變成本加倍。此外,DOM實(shí)現(xiàn)方式的編碼和SAX實(shí)現(xiàn)方式的編碼可由不同的程序員或編程隊(duì)伍創(chuàng)建。這可導(dǎo)致在呈現(xiàn)的對象模型中出現(xiàn)不同的結(jié)果。
前兩個(gè)步驟,即,XML文本字符的分析以及驗(yàn)證文本字符中包含的標(biāo)識(shí)形成合法的XML結(jié)構(gòu),能夠使用“現(xiàn)成的(off-the-shelf)”XML解析器很容易得實(shí)現(xiàn)。上述DOM和SAX API為大多數(shù)基于JAVA的XML解析器所支持。然而,對于第三步驟,即翻譯/映射處理,則變化較大,這主要由于各種解析標(biāo)準(zhǔn)的不同操作方法的緣故。例如,DOM API為基于對象模型的API。當(dāng)被實(shí)現(xiàn)DOM的XML解析器解析時(shí),在內(nèi)存中創(chuàng)建表示XML文檔內(nèi)容的通用文檔對象模型。該文檔對象模型為XML文件的樹形數(shù)據(jù)結(jié)構(gòu)表示,其中,樹的每個(gè)節(jié)點(diǎn)為XML元素,例如,標(biāo)簽、屬性、值等。生成文檔對象模型后,對其遍歷,以創(chuàng)建應(yīng)用對象模型。樹提供了關(guān)于XML文檔結(jié)構(gòu)和內(nèi)容的信息,在翻譯處理中使用該信息以便實(shí)現(xiàn)正確映射。
另一方面,SAX API是基于事件的,從而未利用文檔對象模型。它通常用于無需創(chuàng)建或保持整個(gè)XML樹的內(nèi)存中結(jié)構(gòu)(in-memoryconstruct)的情形。當(dāng)解析文檔時(shí),對事件進(jìn)行處理,在通過事件將數(shù)據(jù)轉(zhuǎn)發(fā)到應(yīng)用后,解析器本身將數(shù)據(jù)丟棄。對于這樣的情形,即,并非出于編輯或圖形顯示的目的,而是為了使用其中包含的數(shù)據(jù)以進(jìn)行進(jìn)一步處理,應(yīng)用需讀取XML文檔內(nèi)容并填充對象模型,這樣做是有益的,正如在以上給出的示例中的情形。
由于存在上述差異,用于生成對象模型的翻譯/映射處理與現(xiàn)有技術(shù)相比具有顯著差異。對在DOM實(shí)現(xiàn)中解析的XML的翻譯處理需要進(jìn)行DOM各個(gè)節(jié)點(diǎn)到對象模型特征的映射。對在SAX實(shí)現(xiàn)中解析的XML的翻譯處理需要進(jìn)行由SAX API所生成的各種事件到對象模型特征的映射。
期望有一種方式,能夠?qū)⒎g規(guī)則(簡單和復(fù)雜)分離成一個(gè)公共共享的代碼集。規(guī)則的代碼需要獨(dú)立于用于讀取和寫入XML的解析器的實(shí)現(xiàn)。而后,可將該公共代碼與公共對象綁在一起,以便為工具和運(yùn)行時(shí)刻應(yīng)用使用,從而,消除現(xiàn)有技術(shù)中所固有的代碼重復(fù)問題。
因此,本發(fā)明的目的在于,提供一種用于載入和保存XML文檔,并在數(shù)據(jù)與對象模型之間來回進(jìn)行轉(zhuǎn)換,且不依賴于所使用的解析器實(shí)現(xiàn)的改進(jìn)方法。
發(fā)明內(nèi)容
本發(fā)明引入了“呈現(xiàn)器(renderer)”和“翻譯器(translator)”的概念。呈現(xiàn)器體現(xiàn)了負(fù)責(zé)對用于讀出與寫入XML的解析器特定API起中介作用的邏輯。呈現(xiàn)器使用多個(gè)翻譯器對象,翻譯器對象體現(xiàn)了將XML轉(zhuǎn)換成對象模型實(shí)例所需要的映射信息。翻譯器對象本身不包含關(guān)于解析器實(shí)現(xiàn)的“知識(shí)(knowledge)”;即,翻譯器中不具有解析器特定依賴性,在翻譯器實(shí)現(xiàn)中也未編碼任何解析器特定API使用。從而,翻譯器是公共的,能夠?yàn)槿魏吻宜谐尸F(xiàn)器實(shí)現(xiàn)所共享和重用。給定的呈現(xiàn)器實(shí)現(xiàn)被一次性構(gòu)建,并且對于所有翻譯器其作用相同;元模型特征到XML標(biāo)簽數(shù)據(jù)的翻譯器映射被一次性編碼,并且對于所有呈現(xiàn)器其作用相同。
本發(fā)明假設(shè)使用元模型,即,描述對象模型以及該模型中的不同對象彼此之間如何相關(guān)的模型。這個(gè)方面是現(xiàn)有技術(shù)系統(tǒng)中熟知的方法。這種元模型的示例包括Eclipse建模框架(EMF)和JAVA bean。在其最簡單形式中,翻譯器是在XML中的標(biāo)簽名與元模型的特征之間的映射,以及使用元模型的特征在值與XML之間來回轉(zhuǎn)換所必需的相關(guān)行為。當(dāng)存在描述對象模型的元模型時(shí),也存在描述XML的表格和標(biāo)簽名的XML元數(shù)據(jù)。當(dāng)設(shè)計(jì)使用本發(fā)明的應(yīng)用系統(tǒng)時(shí),從XML到元模型元數(shù)據(jù)的映射被編碼成翻譯器類,其或是通用的,或是定制的,且通過手工或自動(dòng)化工具生成。就象對象模型那樣,對象“包含(contain)”引用到其他“子(child)”對象,且XML“節(jié)點(diǎn)”具有子節(jié)點(diǎn),從而,翻譯器還包含到子翻譯器的引用,這樣就形成將對象模型和XML元模型相比照的樹形結(jié)構(gòu)。當(dāng)處理和載入XML文件時(shí),訪問頂層或“根”翻譯器。
由于每個(gè)翻譯器包括關(guān)于如何將XML模型轉(zhuǎn)換成對象模型以及如何將對象模型轉(zhuǎn)換成XML的信息和規(guī)則,從而,它獨(dú)立于將要使用的具體呈現(xiàn)器,無論它是SAX,DOM,還是某些其他呈現(xiàn)器。進(jìn)行映射的所有復(fù)雜規(guī)則都包括在翻譯器中,從而,若需要進(jìn)行改變,則在翻譯器級別使其得以實(shí)現(xiàn)。這允許翻譯器變得通用,除非在少數(shù)情形中存在為進(jìn)行翻譯而需要執(zhí)行的復(fù)雜邏輯。對于這些具體翻譯輸入定制規(guī)則,以處理這樣的情形。即便在定制情形中,翻譯器本身也不包含SAX,DOM,或任何其他呈現(xiàn)機(jī)制的“知識(shí)”。而是僅知道如何執(zhí)行轉(zhuǎn)換,使得翻譯器為所有呈現(xiàn)器實(shí)施例所共享。
在現(xiàn)有技術(shù)系統(tǒng)中,本發(fā)明的翻譯器的功能被封裝在適配器中,適配器將用戶約束為對于DOM翻譯使用DOM模型,對于SAX翻譯使用SAX模型,等等。在本發(fā)明中,DOM的作用已從翻譯規(guī)則中分離出。這樣,本發(fā)明從適配器中去除了兩個(gè)域的映射邏輯的綁定,并將其放置在通用對象(翻譯器)中。這使得能夠使用不同的解析器機(jī)制,且可以總是使域保持同步,但也可以不這樣,即,系統(tǒng)非常靈活。映射邏輯可被重用,使得能夠使用在任何特定條件下都最佳運(yùn)行的解析器/呈現(xiàn)器,而不必重寫所有映射邏輯來適應(yīng)解析實(shí)現(xiàn)。
圖1A的框圖表示出用于使XML文檔與其對象模型同步的現(xiàn)有技術(shù)方法以及裝置的基本組件;圖1B表示先前所述用來使用第一程序(用于運(yùn)行時(shí)刻期間的DOM處理)呈現(xiàn)第一對象模型的處理,以及用于通過SAX機(jī)制構(gòu)建對象模型的第二處理;圖2的框圖表示本發(fā)明的用來利用翻譯塊體現(xiàn)翻譯規(guī)則的方法和系統(tǒng);圖3表示翻譯塊的放大視圖;圖4A表示本發(fā)明實(shí)施例的實(shí)現(xiàn);圖4B和4C表示根據(jù)本發(fā)明的示例模型;圖5表示描述面向?qū)ο笙到y(tǒng)中的對象的UML圖,其用于實(shí)現(xiàn)根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于DOM的呈現(xiàn)器;圖6表示根據(jù)本發(fā)明的初始化處理的流程圖;圖7表示根據(jù)本發(fā)明的資源創(chuàng)建的流程圖;圖8表示描述面向?qū)ο笙到y(tǒng)中的對象的UML圖,其用于實(shí)現(xiàn)根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于SAX的呈現(xiàn)器;圖9的簡化流程圖在較高級別表示在根據(jù)本發(fā)明用于將XML轉(zhuǎn)換成對象模型的處理中所執(zhí)行的步驟;圖10的流程圖根據(jù)本發(fā)明的優(yōu)選實(shí)施例表示用于使用如圖8所示SAX呈現(xiàn)器實(shí)現(xiàn)以及SAX解析器,載入XML文檔的處理;圖11的流程圖根據(jù)本發(fā)明的優(yōu)選實(shí)施例表示用于使用如圖5所示DOM呈現(xiàn)器實(shí)現(xiàn)以及DOM解析器,載入XML文檔的處理;
圖12表示當(dāng)使用如圖8所述SAX呈現(xiàn)器實(shí)現(xiàn)時(shí),使用根據(jù)本發(fā)明的翻譯器格式保存XML文檔的方法;圖13表示根據(jù)本發(fā)明優(yōu)選實(shí)施例使用如圖5所示DOM呈現(xiàn)器實(shí)現(xiàn)保存XML文檔的處理。
具體實(shí)施例方式
圖1A的框圖表示出用于使XML文檔與其對象模型同步的現(xiàn)有技術(shù)方法以及裝置的基本組件。在共同受讓的美國專利6,745,208中披露和要求保護(hù)圖1A中所示的發(fā)明。參照圖1A,使用編輯器軟件程序的開發(fā)者通常會(huì)創(chuàng)建XML文檔,在圖1A中一般表示為XML輸入/輸出數(shù)據(jù)層110。XML I/O數(shù)據(jù)層110表示出可通過塊130被用來創(chuàng)建對象模型120的XML文檔。如上述專利所述,可獲得對象模型120的變型例,這些變型例也與XML I/O數(shù)據(jù)層110同步(這就是為什么將XML稱為關(guān)于單元110的“輸入”和“輸出”的原因)。
編輯器軟件對文檔進(jìn)行解析,并構(gòu)建包括節(jié)點(diǎn)132,136,138和142的DOM樹。為了呈現(xiàn)出XML文件的顯示視圖,對DOM樹進(jìn)行翻譯,以將其轉(zhuǎn)換成對象模型120。這允許對象模型120例如通過適當(dāng)?shù)膱D形用戶界面(GUI)被呈現(xiàn)和顯示給用戶。
塊130包括用于將對象模型從DOM進(jìn)行翻譯以及將對象模型與DOM彼此同步的機(jī)制。除DOM樹外,塊130的機(jī)制還包括執(zhí)行翻譯和同步處理的多個(gè)DOM/對象模型適配器134,140和144。由于它們負(fù)責(zé)翻譯和同步處理,從而每個(gè)適配器都是必須特定于相應(yīng)對象模型和XML標(biāo)簽名的個(gè)別編碼類型的實(shí)例。
當(dāng)打開和解析XML文檔時(shí),軟件構(gòu)建起對于DOM樹的具體節(jié)點(diǎn)的具體DOM/對象模型適配器。構(gòu)建DOM/對象模型適配器的方式是本領(lǐng)域所公知的,在此不再進(jìn)行描述。每個(gè)適配器在DOM節(jié)點(diǎn)和其相應(yīng)對象進(jìn)行注冊,以便當(dāng)改變DOM節(jié)點(diǎn)或其所負(fù)責(zé)的對象模型特性時(shí)得到通知。在編輯處理期間,無論是在顯示側(cè)編輯對象模型,還是在源側(cè)編輯DOM節(jié)點(diǎn),在做出改變時(shí),當(dāng)相應(yīng)適配器得到通知時(shí)會(huì)將改變分別反映到相應(yīng)的對象模型或DOM節(jié)點(diǎn)。如果具體編輯導(dǎo)致添加任何對象模型特性或DOM樹節(jié)點(diǎn),則構(gòu)建起相應(yīng)的適配器,并填充相應(yīng)的對象或DOM節(jié)點(diǎn)。以此方式,在無需串行化和重新解析XML文檔的條件下,將源方面進(jìn)行的改變立即反映到顯示方面,反之亦然。關(guān)于如圖1A所示元素的其他細(xì)節(jié)將在以下參照圖1B進(jìn)行討論。
圖1B表示先前所述用來使用第一過程(用于運(yùn)行時(shí)刻期間的DOM處理)呈現(xiàn)第一對象模型120的處理,以及用于通過SAX機(jī)制160構(gòu)建對象模型’150的第二處理。除圖1A所示方法外,如圖1B所示,圖1B還包括使用SAX適配器創(chuàng)建對象模型’。SAX適配器利于每個(gè)事件到對象模型適當(dāng)特征的翻譯/映射,以及對SAX事件的處理,以填充對象模型。以上描述了該方法的缺點(diǎn),在此不再重復(fù)。可以看出,這兩種實(shí)現(xiàn)并行運(yùn)行,且除初始XML編碼外不具有任何“協(xié)作(cooperation)”。
在圖1B中沒有示出讀取XML文檔并形成DOM樹的XML DOM解析器,也沒有示出激發(fā)事件的SAX解析器。這兩者均是眾知的,從而在此不將其示出。
DOM節(jié)點(diǎn)A,DOM節(jié)點(diǎn)B和DOM節(jié)點(diǎn)C單元(分別為項(xiàng)132,136和142)表示來自DOM樹的節(jié)點(diǎn)或“實(shí)體”。DOM適配器A-C(分別為項(xiàng)134,140和144)為雙向適配器,具有域特定代碼,用于“收聽”針對DOM節(jié)點(diǎn)和模型對象的改變。模型對象A-C(分別為項(xiàng)122,124和126)表示由DOM節(jié)點(diǎn)中的值構(gòu)成的模型對象。這些是用于應(yīng)用開發(fā)的用戶特定語義域模型的部分。在圖1B中,DOM節(jié)點(diǎn)B+(項(xiàng)138)表示樹中的“葉”節(jié)點(diǎn),其映射到對象B的簡單屬性(例如,如上所述的“地址(Address)”的“城市(city)”屬性)。在此情形中,收聽節(jié)點(diǎn)B的同一適配器也能收聽節(jié)點(diǎn)B+的改變,并相應(yīng)將改變更新到對象B的屬性。
如上所述,在圖1B中并未示出SAX解析器和處理程序(handler)實(shí)現(xiàn)。處理程序?qū)崿F(xiàn)創(chuàng)建“閱讀器”,通過“閱讀器”來解釋來自SAX事件的標(biāo)簽,以便創(chuàng)建和設(shè)置對象模型中對象的值。SAX機(jī)制160的閱讀器A-C(分別為項(xiàng)162,164和166)為“知曉”標(biāo)簽與對象模型之間關(guān)系的域特定閱讀器。在該簡單實(shí)施例中,處理程序?qū)AX事件進(jìn)行處理,對事件中標(biāo)簽的值執(zhí)行簡單“如果-否則(if-else)”檢查,并執(zhí)行靜態(tài)編譯的代碼(與基于動(dòng)態(tài)特征映射的代碼相反),以創(chuàng)建和設(shè)置對象模型中對象的值。
圖2的框圖表示本發(fā)明的用來利用翻譯塊270體現(xiàn)翻譯規(guī)則的方法和系統(tǒng)。所有翻譯規(guī)則均體現(xiàn)在對象集中,該對象集可于多上下文(例如,DOM,SAX,或其他)中重用,以創(chuàng)建利用這些翻譯器并按需創(chuàng)建適配器的專用“呈現(xiàn)器”。如上所述,先前單純由圖1A和1B所示適配器執(zhí)行的XML到對象模型的翻譯,在現(xiàn)有技術(shù)領(lǐng)域中,對于DOM情形,涉及各個(gè)XML標(biāo)簽名到對象模型的結(jié)構(gòu)特征的映射,或?qū)τ赟AX情形,涉及每個(gè)標(biāo)簽的事件處理的手工編碼。根據(jù)本發(fā)明,提供單獨(dú)的翻譯塊270以隔離翻譯功能,從而使該功能得以通用,即,對所有實(shí)現(xiàn)使用同樣的翻譯器集以同樣的方式將其實(shí)現(xiàn)。從而,可對映射到對象模型元模型的給定XML元模型定義一組翻譯器,且該組翻譯器能夠?yàn)槿魏纬尸F(xiàn)器實(shí)現(xiàn)所共享。從圖2可以看出,在該示例中,翻譯塊270包括第一翻譯器272(翻譯器A),第二翻譯器274(翻譯器B),第三翻譯器276(翻譯器B+),和第四翻譯器278(翻譯器C)。對于非常簡單的映射,翻譯器可以是“通用的”,這在于它并不是專用類,且包含有從標(biāo)簽名到特征的簡單映射;對于更復(fù)雜的映射,翻譯器可以是專用的,具有用于執(zhí)行翻譯邏輯的覆蓋(overridden)方法。在任何情形中,翻譯器可為任何呈現(xiàn)器/解析器實(shí)現(xiàn)所重用。
圖3表示翻譯塊270的放大視圖。從圖3可以看出,每個(gè)翻譯器將XML標(biāo)簽名與結(jié)構(gòu)特征相鏈接。從而,例如,當(dāng)調(diào)出XML標(biāo)簽名時(shí),不管正利用哪個(gè)處理,鏈接將總是相同,且在對象模型中用于呈現(xiàn)的結(jié)果也將相同。由于對每個(gè)XML標(biāo)簽名存在單獨(dú)的翻譯器,系統(tǒng)具有極強(qiáng)的修改靈活性。若需要,則能夠單獨(dú)改變每個(gè)XML,對翻譯器的單獨(dú)改變影響到所有處理(DOM,SAX等)。
圖4A表示本發(fā)明實(shí)施例的實(shí)現(xiàn)方式。圖4A為描述在面向?qū)ο笙到y(tǒng)中對象的UML圖,用于實(shí)現(xiàn)使用根據(jù)本發(fā)明的翻譯器的框架。參照圖4A,對象402為用于創(chuàng)建資源的資源工廠(resource factory)。資源工廠被定義為接口,它可由類來實(shí)現(xiàn),以創(chuàng)建專用資源。它包括一個(gè)方法,“createResource()”??赏ㄟ^文件名,URL或其他,將資源工廠注冊到注冊表中,以便在運(yùn)行時(shí)使用;這樣,當(dāng)發(fā)出載入資源的請求時(shí),會(huì)檢索該資源的資源工廠,并用來創(chuàng)建資源。例如,名為“EJBResourceFactory”的資源工廠可注冊用于名為“ejb-jar.xml”的文件,無論何時(shí)發(fā)出用于載入具有該名稱的文件的請求,都將使用EJBResourceFactory。
對象404表示由資源工廠402所創(chuàng)建的資源。由對象404所示的資源也為接口。資源表示對象模型內(nèi)容的容器。對象模型內(nèi)容從盤上的文檔或文件來填充,通常但不必采用XML格式。在現(xiàn)有技術(shù)中,資源工廠和資源是已知的,如Eclipse建??蚣?EMF)所示。圖4A中所述實(shí)施例是基于這些已知的概念來創(chuàng)建翻譯器的抽象層,如以下所述。
對象406表示翻譯器資源工廠。翻譯器資源工廠是創(chuàng)建翻譯器資源的專用資源工廠。翻譯器資源工廠還與一個(gè)呈現(xiàn)器工廠(對象410,后面會(huì)描述)相關(guān)聯(lián)。
對象408表示翻譯器資源,它是專用形式的資源。翻譯器資源對象408“了解”或包含有關(guān)于作為本發(fā)明的部分用于對象模型到XML轉(zhuǎn)換(反之亦然)的翻譯器的信息。
對象410表示與翻譯器資源工廠406相關(guān)聯(lián)的呈現(xiàn)器工廠。呈現(xiàn)器工廠負(fù)責(zé)創(chuàng)建特定于解析器的呈現(xiàn)器實(shí)現(xiàn),以便為所創(chuàng)建的資源用以進(jìn)行載入和保存。例如,呈現(xiàn)器工廠410能夠包含公共方法“createRenderer()”,該方法用于創(chuàng)建給定資源的呈現(xiàn)器。將呈現(xiàn)器工廠與翻譯器資源工廠分離,使得可使用同一翻譯器資源工廠來創(chuàng)建具有不同呈現(xiàn)器實(shí)現(xiàn)的資源。這樣,呈現(xiàn)器工廠是“可插入”的單元。
對象412表示呈現(xiàn)器。呈現(xiàn)器負(fù)責(zé)分別根據(jù)是否要保存或載入資源而對XML文檔或?qū)ο竽P瓦M(jìn)行實(shí)際呈現(xiàn)。它包含對用于載入和保存XML文件的解析器特定代碼的引用。呈現(xiàn)器使用與用于實(shí)現(xiàn)轉(zhuǎn)換和呈現(xiàn)的資源相關(guān)聯(lián)的翻譯器。
對象414表示翻譯器。翻譯器封裝有用于將對象模型特征轉(zhuǎn)換到XML(反之亦然)的規(guī)則。如414中所示,翻譯器包含有一個(gè)或多個(gè)“domName(dom名)”,或XML標(biāo)簽,和“feature(特征)”,在背景技術(shù)中將其描述為對象模型中的元模型屬性或關(guān)聯(lián)。這樣,翻譯器以其最簡單的形式是XML標(biāo)簽與對象模型特征之間的映射。翻譯器還包含與使用元模型元數(shù)據(jù)將對象模型實(shí)際轉(zhuǎn)換到XML(反之亦然)有關(guān)的行為??蓪Ψg器進(jìn)行特殊化或子類劃分(subclass),以添加其他定制行為。翻譯器資源知道將隨后指向N個(gè)“子”翻譯器(關(guān)聯(lián)416所示)的集合的一個(gè)“根翻譯器”,從而形成將對象模型樹轉(zhuǎn)換到XML結(jié)構(gòu)的翻譯器樹。
這樣,如圖6和7更詳細(xì)描述的,在圖4A中的對象包括能夠用于針對根據(jù)本發(fā)明的對象模型載入和保存XML文檔的框架。源404為表示對象模型的內(nèi)存中表示的頂層容器,如同在圖2中所示對象模型220。專用資源,即翻譯器資源408,包含到多個(gè)翻譯器的鏈接,如同翻譯塊270,開始于頂層或“根”翻譯器。翻譯器資源對呈現(xiàn)器對象412委托實(shí)際的“呈現(xiàn)”。呈現(xiàn)器對象412將使用翻譯器以及特定于XML解析器的API來執(zhí)行文檔的載入和保存。資源工廠402,翻譯器資源工廠406和呈現(xiàn)器工廠410提供基于所處理的XML文件的名稱來創(chuàng)建專用資源的動(dòng)態(tài)、靈活的框架。所創(chuàng)建的每個(gè)資源將與由與注冊的翻譯器資源工廠相關(guān)聯(lián)的呈現(xiàn)器工廠所創(chuàng)建的特定于解析器的呈現(xiàn)器相關(guān)聯(lián)。
圖4B和4C表示根據(jù)本發(fā)明的示例模型。更具體而言,如后面更詳細(xì)描述的,圖4B和4C表示應(yīng)用的樣本對象模型。XML代碼的樣本“片斷”為基于圖中所示對象模型實(shí)例的XML的呈現(xiàn)。另外,還示出相應(yīng)的翻譯器實(shí)例,其包含對象模型到XML的映射,如樹結(jié)構(gòu)所示。應(yīng)注意,翻譯器是“無狀態(tài)的”,即,不保持任何對話狀態(tài)。對每個(gè)映射一次性創(chuàng)建對象,并且將其用于所有載入和保存請求。
圖4B顯示出元模型420,或系統(tǒng)中對象的描述。圖中示出兩個(gè)對象,雇員(Employee)(422)和地址(Address)(424)。雇員(Employee)具有“姓名(name)”屬性,并包含有一個(gè)地址(Address)。地址(Address)包含屬性“城市(city)”和“州(state)”。在元模型中,將雇員(Employee).姓名(name),雇員(Employee).地址(Address),地址(Address).城市(city)和地址(Address).州(state)均描述為結(jié)構(gòu)特征或特征,如本發(fā)明背景技術(shù)中所述。
圖4C顯示出使用對象模型420的對象的實(shí)際實(shí)例,在圖4C中示為420C。該圖顯示出姓名(name)屬性值為“Joe”的一個(gè)雇員(Employee)實(shí)例(422C)。雇員(Employee)具有地址(Address)(424C),地址(Address)(424C)具有分別為“Raleigh″和“NC”的城市(city)和州(state)值。
所呈現(xiàn)的XML源430是通過使用翻譯器結(jié)構(gòu)將結(jié)構(gòu)特征從對象模型映射到XML標(biāo)簽而產(chǎn)生的。以翻譯器A(432)開始,文檔的“根”翻譯器,向“雇員(Employee)”對象類型指示資源的根的結(jié)構(gòu)特征映射至“雇員(Employee)”XML標(biāo)簽。翻譯器B(434)和C(436)為翻譯器A的“子”翻譯器。翻譯器B包含簡單屬性特征(對象“雇員(Employee)”的“姓名(name)”特征)的映射。由于“姓名(name)”為屬性而不是對象引用,翻譯器B本身并不具有任何子翻譯器,從而視為“被父翻譯器所管理”。翻譯器B將被用于在XML實(shí)例文件的載入和保存期間獲取和設(shè)置雇員(Employee)對象實(shí)例的姓名(name)屬性值。
翻譯器C為對于雇員(Employee)對象的“地址(Address)”特征的翻譯器。它將該特征映射到“地址(Address)”XML標(biāo)簽,如圖中以及XML源碼中所示。由于地址(Address)特征映射到另一對象(地址(Address)對象,其本身包含有特征),從而,翻譯器C包含有由此將地址(Address)特征映射到XML標(biāo)簽的子翻譯器。
翻譯器C1(438)和C2(440)為處理地址(Address)對象的“城市(city)”和“州(state)”特征的子翻譯器。由于這些特征為簡單屬性,C1和C2并不包含子翻譯器。
根據(jù)本發(fā)明,當(dāng)載入XML源碼時(shí),將使用翻譯器資源工廠(例如,圖4A的406)創(chuàng)建新的翻譯器資源(例如,圖4A的408)。翻譯器資源將包含對“根”翻譯器(翻譯器A)的引用,并在載入后,將包含對雇員(Employee)實(shí)例對象的引用以作為其“內(nèi)容”。翻譯器資源將載入委托于與其相關(guān)的呈現(xiàn)器(例如,圖4A的412),以創(chuàng)建如實(shí)例模型中所示的雇員(Employee)和地址(Address)對象,其中,相關(guān)呈現(xiàn)器使用根翻譯器A以及翻譯器A的所有后代。呈現(xiàn)器將執(zhí)行與XML解析器實(shí)現(xiàn)的實(shí)際交互。這樣,圖4B和4C所示示例表示根據(jù)本發(fā)明如何使用圖2,3和4A中所示對象從XML呈現(xiàn)實(shí)例模型,或從實(shí)例模型呈現(xiàn)XML。
圖5表示描述面向?qū)ο笙到y(tǒng)中的對象的UML圖,其用于實(shí)現(xiàn)根據(jù)本發(fā)明的基于DOM的呈現(xiàn)器。參照圖5,對象502和504分別表示呈現(xiàn)器工廠和DOM呈現(xiàn)器工廠。DOM呈現(xiàn)器工廠為專用類型的呈現(xiàn)器工廠,它用于創(chuàng)建DOM呈現(xiàn)器(對象508,如后面進(jìn)行的描述)的實(shí)例??蓪OM呈現(xiàn)器工廠504插入到翻譯器資源工廠中,如在圖4中用于確保使用DOM呈現(xiàn)器載入和保存新資源的翻譯器資源工廠406與呈現(xiàn)器工廠410之間的鏈接所示。
對象502和506顯示出呈現(xiàn)器工廠與呈現(xiàn)器之間的抽象關(guān)系,且DOM呈現(xiàn)器508為專用具體呈現(xiàn)器工廠DOM呈現(xiàn)器工廠504所創(chuàng)建的專用具體呈現(xiàn)器。DOM呈現(xiàn)器508包含用于使用XML DOM解析器,讀取并創(chuàng)建DOM節(jié)點(diǎn),以及創(chuàng)建DOM/對象模型適配器(項(xiàng)510)的DOM專用代碼。
對象510為DOM對象模型適配器。DOM對象模型適配器為位于XML單元(對象518)與對象模型對象(對象516)之間的適配器。這與如圖1B所示DOM適配器134,140,144相似。然而,根據(jù)本發(fā)明,DOM對象模型適配器510是通用的,且本身不包含特定映射或翻譯代碼,如同圖1B或2中的DOM適配器134,140和144。當(dāng)然,如同在翻譯塊270中的翻譯器,對其相關(guān)聯(lián)的翻譯器512進(jìn)行委托。
DOM對象模型適配器510與翻譯器512相關(guān)。翻譯器512用于執(zhí)行低層XML到對象和對象到XML的轉(zhuǎn)換。如關(guān)聯(lián)514(以及參照圖4所述,如圖2中翻譯器B和翻譯器B+,即,項(xiàng)274和276所示)所示,翻譯器可包含零個(gè)或更多子翻譯器。這形成了翻譯器樹,該翻譯器樹反映出XML單元的樹和對象模型對象的樹。從而,對于具有子單元的給定XML實(shí)體,相應(yīng)的翻譯器將具有能夠?qū)⒆訂卧g到對象模型的子翻譯器。對象516為對象模型,如同對象模型220中的對象,對象518為XML DOM結(jié)構(gòu)中的單元或節(jié)點(diǎn),如同圖2中所示項(xiàng)132-142。這樣,根據(jù)本發(fā)明的優(yōu)選實(shí)施例,以及如圖11和13流程圖的進(jìn)一步詳細(xì)描述的,圖5中的對象包括可用于構(gòu)造DOM呈現(xiàn)器實(shí)現(xiàn)的組件,所述DOM呈現(xiàn)器實(shí)現(xiàn)使用翻譯塊270將XML轉(zhuǎn)換到對象模型,反之亦然。
圖6表示根據(jù)本發(fā)明的初始化處理的流程圖。在圖6中,在系統(tǒng)“啟動(dòng)”期間,對于示例XML文件“META-INF/ejb-jar.xml”,在呈現(xiàn)器工廠(例如,圖4A的410)注冊翻譯器資源工廠(例如,圖4A的406)。根據(jù)本發(fā)明,圖6所示初始化處理示出預(yù)見到用于載入資源的未來請求的對資源工廠和呈現(xiàn)器工廠的預(yù)注冊。處理開始于步驟602,在步驟604,作為正常啟動(dòng)程序的部分,觸發(fā)初始化處理。該過程將根據(jù)環(huán)境而有所不同。例如,應(yīng)用服務(wù)器可具有良好定義的啟動(dòng)序列,而IDE可利用“按需載入”方法啟動(dòng)插件。
在步驟604,在啟動(dòng)處理期間,全局呈現(xiàn)器工廠是缺省的。這是用于確定將使用何種形式呈現(xiàn)器(例如,SAX,DOM,或其他形式)來載入和保存資源以及執(zhí)行XML到對象模型轉(zhuǎn)換的機(jī)制。在優(yōu)選實(shí)施例中,呈現(xiàn)器工廠不必是全局的,而是對于給定資源集可具有作用域或被隔離化,以便對不同的資源集注冊不同的呈現(xiàn)器工廠。例如,在IDE中的“項(xiàng)目(projects)”可使用DOM呈現(xiàn)器載入資源,而將“存檔文件(archives)”輸入到IDE可使用SAX呈現(xiàn)器。另外,在優(yōu)選實(shí)施例中,可基于上下文,系統(tǒng)狀態(tài),項(xiàng)目內(nèi)容(于此處將“項(xiàng)目”定義為IDE中的文件集合),模塊內(nèi)容(于此處將“模塊”定義為組成運(yùn)行服務(wù)器中應(yīng)用的文件集合),或任何其他可用于得出呈現(xiàn)器的可變標(biāo)準(zhǔn)集,注冊不同的呈現(xiàn)器工廠。例如,可基于“上下文”或系統(tǒng)狀態(tài)(例如,UI,非UI等)動(dòng)態(tài)地確定呈現(xiàn)器工廠。
在步驟608,對于名為“META-INF/ejb-jar.xml”的文件,創(chuàng)建翻譯器資源工廠。如對象模型圖(圖4A和5)所示,翻譯器資源工廠為負(fù)責(zé)創(chuàng)建翻譯器資源的對象,其使用呈現(xiàn)器進(jìn)行載入和保存。在優(yōu)選實(shí)施例中,對于使用根據(jù)本發(fā)明的翻譯器機(jī)制的每個(gè)XML資源類型,將重復(fù)圖6中所示的步驟;例如,對于如J2EE規(guī)范所定義的所有“配置描述符”的情形。
在步驟610,將用于在步驟608中所創(chuàng)建的新翻譯器資源工廠的呈現(xiàn)器工廠設(shè)置為“全局”呈現(xiàn)器工廠(作為一示例,假設(shè)全局工廠基于某些外部系統(tǒng)設(shè)置,例如環(huán)境變量,進(jìn)行缺省設(shè)置)。從而,只要該翻譯器資源工廠被用來創(chuàng)建新資源,則它將使用該呈現(xiàn)器工廠也創(chuàng)建相應(yīng)的呈現(xiàn)器。
在步驟612,對所有命名的文件(在該示例中為“META-INF/ejb-jar.xml”)注冊新翻譯器資源工廠。這樣,只要作出使用該名稱創(chuàng)建資源的請求,則將檢索到注冊的翻譯器資源工廠并將其用于資源創(chuàng)建。應(yīng)注意,盡管以上示出特定的文件名,但可使用任何文件名,且這也在本發(fā)明的范圍內(nèi)。最后,在步驟614,完成初始化處理。從而,根據(jù)本發(fā)明,現(xiàn)將系統(tǒng)初始化成當(dāng)請求創(chuàng)建、載入、或保存資源時(shí),如圖7,10,11,12和13中進(jìn)一步詳細(xì)描述的,將使用基于文件名注冊的翻譯器資源工廠(例如,圖4A的406)創(chuàng)建資源。將使用與翻譯器資源工廠相關(guān)聯(lián)的呈現(xiàn)器工廠(例如,圖4A的410)創(chuàng)建專用呈現(xiàn)器,專用呈現(xiàn)器將使用與新資源相關(guān)聯(lián)的翻譯器以及特定于解析器的API進(jìn)行XML到對象模型的轉(zhuǎn)換。
圖7表示根據(jù)本發(fā)明的資源創(chuàng)建的流程圖。處理開始于步驟702,在步驟704,發(fā)出用于創(chuàng)建示例資源“META-INF/ejb-jar.xml”的請求。在步驟706,系統(tǒng)對注冊的資源工廠進(jìn)行檢索。該資源工廠將為翻譯器資源工廠。
在步驟708,翻譯器資源工廠接收createResource()方法調(diào)用。其指令該工廠創(chuàng)建新資源。在步驟710,翻譯器資源工廠使用其相關(guān)聯(lián)的呈現(xiàn)器工廠創(chuàng)建新呈現(xiàn)器。如圖6所示,在初始化期間,呈現(xiàn)器工廠與該資源工廠相關(guān)聯(lián)。
在步驟712,翻譯器資源工廠創(chuàng)建新的翻譯器資源,并將其呈現(xiàn)器設(shè)置成剛創(chuàng)建的新呈現(xiàn)器。從而,當(dāng)資源接收用于“載入”或“保存”的方法調(diào)用時(shí),它將該處理委托于其呈現(xiàn)器,該呈現(xiàn)器將實(shí)際執(zhí)行將對象模型轉(zhuǎn)換到XML的特定于實(shí)現(xiàn)的工作和/或使用特定XML解析器實(shí)現(xiàn)。
在步驟714,將新資源返回至請求創(chuàng)建(步驟704)的調(diào)用對象,并在步驟716,處理結(jié)束。從而,圖7描述了圖4A中的對象的交互,從而,新翻譯器資源與呈現(xiàn)器相關(guān)聯(lián),該呈現(xiàn)器將用于從XML載入和保存至XML。
圖8為描述面向?qū)ο笙到y(tǒng)中的對象的UML圖,其用于實(shí)現(xiàn)根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于SAX的呈現(xiàn)器。
SAX呈現(xiàn)器808為特定類型的呈現(xiàn)器804,體現(xiàn)有特定于SAX解析器的API引用。SAX呈現(xiàn)器808使用XML(SAX)的簡單API來讀取XML文檔。SAX為基于事件的解析機(jī)制,該機(jī)制聲明每個(gè)XML文檔的開始元素,包含內(nèi)容和結(jié)束元素。本領(lǐng)域普通技術(shù)人員應(yīng)熟悉SAXAPI,以及熟悉SAX事件。
對象至SAX文檔處理程序(Object2SAX Document Handler)810實(shí)現(xiàn)從SAX解析器接收事件的內(nèi)容處理程序接口811。對象至SAX文檔處理程序810對象使用高速緩存事件XXX對象來解析XML文檔。每個(gè)高速緩存事件節(jié)點(diǎn)包含關(guān)于SAX事件的信息。該信息包含應(yīng)被用來協(xié)調(diào)對對象模型來/回進(jìn)行呈現(xiàn)的相應(yīng)翻譯器,與來自文檔的XML節(jié)點(diǎn)相關(guān)聯(lián)的屬性,和XML節(jié)點(diǎn)的實(shí)際內(nèi)容。
SAX呈現(xiàn)器使用種類迥異的適配器來利用翻譯器816。高速緩存事件節(jié)點(diǎn)822將SAX事件與專用XML元素,其內(nèi)容和屬性以及相應(yīng)的翻譯器816進(jìn)行協(xié)調(diào)。注意,這就是在DOM中所使用的相同的翻譯器816,不過是在不同的范例中進(jìn)行構(gòu)建。每個(gè)高速緩存事件節(jié)點(diǎn)822在接收到SAX“開始元素”事件時(shí)被創(chuàng)建。若需要,調(diào)用翻譯器816來創(chuàng)建模型對象,如果需要父對象,則頂層高速緩存事件節(jié)點(diǎn)是可訪問的。然后,將高速緩存事件節(jié)點(diǎn)推入堆棧以緩沖到達(dá)的數(shù)據(jù)。按同樣的方式將聲明的任何新XML元素推入高速緩存事件堆棧818。當(dāng)接收到結(jié)束元素事件時(shí),使頂層高速緩存事件節(jié)點(diǎn)出棧,并調(diào)用翻譯器以關(guān)閉和完成模型對象的填充。高速緩存事件池820為輔助對象,它是出于性能的目的而被創(chuàng)建用于重用高速緩存事件節(jié)點(diǎn)822的現(xiàn)有(空的)實(shí)例,以避免過度的對象創(chuàng)建和廢物收集。
對象至SAX書寫器(Object2SAX Writer)814使用翻譯器816來理解對象模型,并向能夠以文本格式輸出數(shù)據(jù)的流書寫器聲明XML元素和內(nèi)容。
翻譯器816與每個(gè)高速緩存事件節(jié)點(diǎn)822相關(guān)聯(lián)。將翻譯器816構(gòu)建成理解所設(shè)計(jì)處理的文檔的結(jié)構(gòu),這意味著不需要來自高速緩存事件節(jié)點(diǎn)的進(jìn)一步信息就能知道當(dāng)從SAX解析器接收事件時(shí)要?jiǎng)?chuàng)建哪一個(gè)翻譯器。它使用翻譯器進(jìn)行低層XML到對象以及對象到XML的轉(zhuǎn)換。
圖9的簡化流程圖在高層表示在根據(jù)本發(fā)明用于將XML轉(zhuǎn)換成對象模型的處理中所執(zhí)行的步驟。在步驟900,為與待創(chuàng)建對象模型的特征相關(guān)聯(lián)的每個(gè)XML標(biāo)簽創(chuàng)建翻譯器。對于由XML元數(shù)據(jù)(例如,XSD或DTD)定義的所有XML標(biāo)簽,都將具有翻譯器。不過,翻譯器并非必須要映射到特征。在大多數(shù)情況下是這樣的。然而,在使用定制翻譯器的情形中,可使用特殊代碼執(zhí)行用于該具體XML標(biāo)簽的翻譯規(guī)則。
那些的確產(chǎn)生對象模型中特征的XML標(biāo)簽被映射到該特征,并將映射存儲(chǔ)為翻譯器注冊表中的翻譯器。在注冊表內(nèi),“根翻譯器”與每種資源類型相關(guān)聯(lián)(例如,關(guān)于類型“ejb-jar.xml”的資源將與“EJBJARootTranslator”對象相關(guān)聯(lián))?!霸谝髸r(shí)”,或者首次被請求時(shí),僅進(jìn)行一次翻譯器和映射的創(chuàng)建。之后,將它們高速緩存在內(nèi)存中,以備用于任何隨后的載入或保存。
在步驟902,解析器按照已知方法解析XML,并且在步驟904識(shí)別需要轉(zhuǎn)換的每一個(gè)標(biāo)簽。在步驟905,創(chuàng)建特定于解析器的適配器對象,并將其與來自解析器的標(biāo)簽數(shù)據(jù)相關(guān)聯(lián)。
在步驟906,適配器訪問翻譯塊,獲得步驟904中被識(shí)別的標(biāo)簽中第一個(gè)(或下一個(gè))標(biāo)簽的適當(dāng)翻譯器。在步驟908,適配器使用翻譯器創(chuàng)建對象模型和對其設(shè)置值,并使用映射信息或定制代碼執(zhí)行翻譯,以及相應(yīng)對值進(jìn)行設(shè)置。
由于翻譯器包含關(guān)于標(biāo)簽到特征映射的通用信息,它不區(qū)分是使用DOM樹還是SAX API執(zhí)行解析。與解析XML文檔中所發(fā)現(xiàn)的不同特征相對應(yīng)的DOM樹或事件(SAX API)的存在與翻譯器無關(guān);它需要“知道”的所有信息是將被處理的標(biāo)簽與具體特征相關(guān)聯(lián),而不管具體對象節(jié)點(diǎn)或事件是否與特征相關(guān)聯(lián)。從而,本發(fā)明的翻譯塊能夠使用與XML到對象模型轉(zhuǎn)換有關(guān)的任何種類的解析標(biāo)準(zhǔn)。
在步驟910,確定是否存在要進(jìn)行轉(zhuǎn)換的其他標(biāo)簽。若存在,則處理返回到步驟904,處理下一個(gè)標(biāo)簽。若不存在,則處理進(jìn)行到步驟912,處理結(jié)束。
圖10的流程圖根據(jù)本發(fā)明的優(yōu)選實(shí)施例表示用于使用如圖8所示SAX呈現(xiàn)器實(shí)現(xiàn)以及SAX解析器載入XML文檔的處理。處理開始于步驟1000,在步驟1001,發(fā)出用于載入資源的請求。如圖4所示,本發(fā)明上下文中的資源為表示與給定XML文檔相對應(yīng)的對象模型的內(nèi)容。在步驟1002,創(chuàng)建資源(參看圖6)。在步驟1003,請求載入所創(chuàng)建的資源,資源將該請求委托于其呈現(xiàn)器(步驟1004)。例如,SAX呈現(xiàn)器將使用SAX解析器對XML文檔進(jìn)行解析,接收事件,填充對象模型。在步驟1005,從XML文檔創(chuàng)建SAX解析器。這可通過使用眾所周知的API創(chuàng)建XML文檔的“輸入源”來實(shí)現(xiàn),由此創(chuàng)建SAX解析器。然后,對SAX解析器給出“parse()”命令,該命令導(dǎo)致對輸入源進(jìn)行掃描和解析,從而對SAX處理程序激發(fā)“事件”。
在步驟1006,SAX呈現(xiàn)器從SAX解析器接收“開始文檔”事件。眾所周知,SAX解析器需要處理程序,并激發(fā)SAX事件。如圖8所示,SAX呈現(xiàn)器使用對象至SAX文檔處理程序,這樣,該處理程序?qū)慕馕銎鹘邮帐录?br>
在步驟1007,將當(dāng)前高速緩存事件設(shè)置成等于“根”,這將當(dāng)前高速緩存事件推入堆棧。在許多情形中,當(dāng)遇到標(biāo)簽時(shí)可立即對事件進(jìn)行處理。然而,在某些情形中,翻譯需要更多的信息,該信息處在文檔中再往下才出現(xiàn)的標(biāo)簽中。在這樣的情形中,使標(biāo)簽的處理延遲,直至獲得所有所需信息。這樣,創(chuàng)建出“高速緩存事件”,并將其添加到延遲處理的堆棧中。
在步驟1008,確定是否存在打開元素,其中,打開元素表示XML文檔的開始。如果確定不存在打開元素,則處理進(jìn)行到步驟1024,在此確定是否到達(dá)XML文檔的末尾。如果在步驟1024確定已到達(dá)文檔的末尾,則處理進(jìn)行到步驟1025,在此,SAX呈現(xiàn)器接收“結(jié)束文檔”事件,然后進(jìn)行到步驟1026,在此將當(dāng)前高速緩存事件設(shè)置成等于“根”。當(dāng)文檔終止時(shí),由于XML元素的終止,從堆棧彈出當(dāng)前高速緩存事件,有效完成XML元素及其內(nèi)容的處理。然后,處理進(jìn)行到步驟1027,在此處理終止。
如果在步驟1008確定存在打開元素,則處理進(jìn)行到步驟1009,在此,SAX呈現(xiàn)器從解析器接收“開始XML元素”事件。然后,處理進(jìn)行到步驟1010,在此將當(dāng)前高速緩存事件設(shè)置成等于“具有XML節(jié)點(diǎn)的新緩存事件”,將該事件推入堆棧,以保持文檔的當(dāng)前處理狀態(tài)。使用堆棧來處理遞歸數(shù)據(jù)是本領(lǐng)域中的標(biāo)準(zhǔn)技術(shù)。然后,處理返回到步驟1008,以確定是否存在另一個(gè)打開元素。如果存在另一個(gè)打開元素,重復(fù)步驟1009和1010的過程。如果在步驟1008確定出不存在打開元素,則如果處理進(jìn)行到步驟1024,且確定出未到達(dá)文檔末尾。則處理進(jìn)行到步驟1011,在此確定字符數(shù)據(jù)是否可用。字符數(shù)據(jù)只是XML元素的文本內(nèi)容。如果在步驟1011確定出不存在任何字符,則處理進(jìn)行到步驟1014,在此確定是否存在關(guān)閉元素。關(guān)閉元素為所處理的當(dāng)前XML元素的邏輯終止XML元素。如果沒有找到任何關(guān)閉元素,則SAX解析器將產(chǎn)生表示文檔無效的異常。如果在步驟1014確定出存在關(guān)閉元素,處理進(jìn)行到步驟1015,在此,SAX呈現(xiàn)器接收“結(jié)束XML元素”事件,然后,處理進(jìn)行到步驟1016,在此從堆棧頂部彈出當(dāng)前高速緩存事件。從堆棧頂部彈出高速緩存事件節(jié)點(diǎn)有效地記錄了元素已完全被處理的情況。然后,處理進(jìn)行到步驟1017,在此,從預(yù)定義翻譯器的注冊表中找出適當(dāng)?shù)淖臃g器。更具體而言,以頂層高速緩存事件緩沖頂層翻譯器,使用XML節(jié)點(diǎn)名,通過搜索子翻譯器,找到XML節(jié)點(diǎn)的適當(dāng)翻譯器。由于該處理假設(shè)良好構(gòu)建的XML,從而總是出現(xiàn)關(guān)閉元素。如果XML并未良好構(gòu)建,則SAX解析器也會(huì)解析出錯(cuò)誤。
然后,處理進(jìn)行到步驟1018,在此確定子翻譯器是否由父翻譯器進(jìn)行管理。“由父翻譯器管理”表示為布爾標(biāo)志,該標(biāo)志描述翻譯器是否表示在現(xiàn)有模型對象上的簡單數(shù)據(jù)類型的設(shè)置,或子模型對象的創(chuàng)建。由父翻譯器管理的翻譯器將不具有子翻譯器,從而表示到簡單數(shù)據(jù)類型的映射。
如果在步驟1018確定出子翻譯器由父翻譯器管理,則處理進(jìn)行到步驟1019,在此將子翻譯器用于轉(zhuǎn)換當(dāng)前高速緩存事件中所保存的值。然后,處理進(jìn)行到步驟1020,在此將子翻譯器用于對模型對象設(shè)置轉(zhuǎn)換的值。對于普通、簡單的情形,子翻譯器將使用元模型信息對模型對象執(zhí)行動(dòng)態(tài)“setValue(設(shè)置值)”操作,將結(jié)構(gòu)特征和轉(zhuǎn)換的值傳遞到對象模型。在定制情形中,子翻譯器將執(zhí)行用于設(shè)置值的定制代碼。然后,處理進(jìn)行到步驟1008,如以上所述繼續(xù)向下執(zhí)行。
如果在步驟1018確定出子翻譯器不被父翻譯器管理,則處理進(jìn)行到步驟1022,在此使用來自步驟1017的子翻譯器創(chuàng)建新的模型對象。然后,處理進(jìn)行到步驟1023,在此使用來自步驟1017的子翻譯器將新模型添加到父對象(高速緩存事件將包含該父對象),然后,處理進(jìn)行到如上所述的步驟1008。
如果在步驟1011確定出字符數(shù)據(jù)確實(shí)存在,則處理進(jìn)行到步驟1012,在此SAX呈現(xiàn)器接收“數(shù)據(jù)”事件,然后,處理進(jìn)行到步驟1013,在此,SAX呈現(xiàn)器將數(shù)據(jù)添加到當(dāng)前高速緩存事件的緩沖區(qū)中,然后,處理進(jìn)行到步驟1014,并按如上所述進(jìn)行操作。
圖11的流程圖根據(jù)本發(fā)明的優(yōu)選實(shí)施例表示用于使用如圖5所示DOM呈現(xiàn)器實(shí)現(xiàn)以及DOM解析器載入XML文檔的處理。在步驟1100,處理開始。在步驟1101,發(fā)出用于載入示例資源“META-INF/ejb-jar.xml”的請求。在步驟1102,使用圖7中描述的機(jī)制創(chuàng)建資源。在步驟1103,請求載入該資源。在步驟1104,將載入委托于DOM呈現(xiàn)器。在步驟1105,使用眾所周知API載入DOM模型,以便將XML文檔載入DOM模型。本領(lǐng)域普通技術(shù)人員應(yīng)該理解步驟1100-1104與步驟1000-1004的相似之處。這些步驟實(shí)質(zhì)上是相同,只是有一個(gè)很小的差別在步驟1004,對于SAX示例,假設(shè)已將如圖8所述“SAX”呈現(xiàn)器工廠在系統(tǒng)中預(yù)注冊用于文件ejb-jar.xml。在步驟1104,另一方面,為示出DOM呈現(xiàn)器的使用,假設(shè)已預(yù)注冊“DOM”呈現(xiàn)器工廠,如圖5所示。在這兩種情形中,當(dāng)進(jìn)行載入請求時(shí),系統(tǒng)必須做兩件事情創(chuàng)建資源(如圖7所示),然后將其載入。如圖7所示,以適當(dāng)?shù)某尸F(xiàn)器創(chuàng)建資源,然后將載入委托于呈現(xiàn)器。
在步驟1106,從資源中檢索根翻譯器。在步驟1107,使用根翻譯器、資源和DOM文檔創(chuàng)建根適配器。如圖5所示,DOM/對象模型適配器包含對其翻譯器以及與之相關(guān)聯(lián)的DOM節(jié)點(diǎn)的引用。
由于要執(zhí)行DOM對象結(jié)構(gòu)的樹遍歷,必須跟蹤“當(dāng)前”適配器。在步驟1108,將當(dāng)前適配器設(shè)置成等于根適配器。對于每個(gè)適配器,必須訪問到子適配器,以及其子適配器的子適配器,等等,直至不再有其他子適配器。此時(shí),處理“解退(unwind)”回父適配器??墒褂眠f歸算法執(zhí)行該處理,從而,當(dāng)使用遞歸算法時(shí),將“當(dāng)前”適配器實(shí)際附著到方法堆棧。
然后,處理進(jìn)行到步驟1109,在此確定與當(dāng)前適配器相關(guān)聯(lián)的節(jié)點(diǎn)(此后稱之為“當(dāng)前節(jié)點(diǎn)”)是否具有其他DOM子節(jié)點(diǎn)。如圖5所示,當(dāng)前適配器與DOM節(jié)點(diǎn)相關(guān)聯(lián)。獲得DOM節(jié)點(diǎn)的子節(jié)點(diǎn),并反復(fù)迭代。如果當(dāng)前節(jié)點(diǎn)不再具有其他DOM子節(jié)點(diǎn),處理進(jìn)行到步驟1121,在此確定當(dāng)前適配器是否具有父適配器。這是通過確定處理是否到達(dá)頂層節(jié)點(diǎn)(其為DOM文檔)來實(shí)現(xiàn)。如果處理到達(dá)頂層文檔,則完成了處理,這是由于已遍歷所有的子節(jié)點(diǎn)。
如果當(dāng)前適配器具有父適配器,則處理進(jìn)行到步驟1122,在此將當(dāng)前適配器設(shè)置成等于父適配器(如以上所述的解退步驟),然后,處理返回到步驟1109。如果在步驟1121確定出當(dāng)前適配器不具有父適配器,則處理進(jìn)行到步驟1123,在此完成處理。
如果在步驟1109確定出當(dāng)前節(jié)點(diǎn)具有其他的DOM子節(jié)點(diǎn),則處理進(jìn)行到步驟1110,在此檢索下一個(gè)DOM子節(jié)點(diǎn)。在步驟1111,獲得名稱上與DOM子節(jié)點(diǎn)相對應(yīng)的子翻譯器。如圖5所示,當(dāng)前翻譯器包含子翻譯器的列表。搜索子翻譯器列表,將與子翻譯器相關(guān)聯(lián)的DOM名稱與當(dāng)前DOM子節(jié)點(diǎn)的DOM名稱相對比。在優(yōu)選實(shí)施例中,翻譯器還可保持將DOM名稱映射到相關(guān)聯(lián)子翻譯器的查詢表。然后,處理進(jìn)行到步驟1112,在此確定在步驟1111中所搜索的與當(dāng)前節(jié)點(diǎn)的DOM名稱相對應(yīng)的翻譯器是否存在。
如果翻譯器不存在,處理返回到步驟1109,以確定是否具有其他DOM子節(jié)點(diǎn)。如果用驗(yàn)證解析器解析XML文檔,則可知該文檔遵循DTD或XSD定義的元數(shù)據(jù)規(guī)則,那么,該路徑通常不會(huì)出現(xiàn),這是由于應(yīng)用開發(fā)人員應(yīng)該為每個(gè)已知XML標(biāo)簽定義翻譯器。然而,如果使用非驗(yàn)證解析器,則文檔有可能包含具有未知標(biāo)簽的無效數(shù)據(jù),在此情形中,將這些標(biāo)簽忽略掉,或者,應(yīng)提升錯(cuò)誤條件。出于該示例說明的目的,忽略了未識(shí)別的標(biāo)簽。
如果在步驟1112確定不存在子翻譯器,則處理進(jìn)行到步驟1113,在此確定該翻譯器是否由父翻譯器管理。如果該翻譯器由父翻譯器管理,則處理進(jìn)行到步驟1114,在此使用該翻譯器將節(jié)點(diǎn)值從字符串轉(zhuǎn)換成適于對象模型特征的數(shù)據(jù)類型(例如,整型、日期型等)。在基本情形中,對象模型特征包含可用于翻譯器的元數(shù)據(jù),以便執(zhí)行通用轉(zhuǎn)換。在定制情形中,翻譯器將包含定制代碼,以執(zhí)行轉(zhuǎn)換。然后,處理進(jìn)行到步驟1115,在此使用翻譯器對對象模型設(shè)置轉(zhuǎn)換值。在基本情形中,子翻譯器將使用元模型信息對對象模型執(zhí)行動(dòng)態(tài)“setValue(設(shè)置值)”操作,傳遞結(jié)構(gòu)特征和轉(zhuǎn)換值。在定制情形中,子翻譯器將執(zhí)行用于設(shè)置值的定制代碼。然后,處理返回到步驟1009,以確定當(dāng)前適配器的XML節(jié)點(diǎn)是否具有其他DOM子節(jié)點(diǎn)。
如果在步驟1113確定翻譯器不由父翻譯器管理,則在步驟1116使用子翻譯器創(chuàng)建新適配器,然后,處理進(jìn)行到步驟1117,在此使用該翻譯器創(chuàng)建新的模型對象。然后,處理進(jìn)行到步驟1118,在此使用該翻譯器將新模型對象添加到父對象。在簡單情形中,翻譯器能夠反映結(jié)構(gòu)特征的元模型信息以“set(設(shè)置)”值。在單個(gè)值特征的情形中,在父對象上調(diào)用“set(設(shè)置)”操作,傳遞結(jié)構(gòu)特征和值。在多值特征的情形中,調(diào)用“add(添加)”操作。在定制翻譯器的情形中,可在翻譯器中實(shí)現(xiàn)定制“setValue(設(shè)置值)”方法。然后,處理進(jìn)行到步驟1119,在此將當(dāng)前適配器設(shè)置成等于新適配器,然后,處理返回到步驟1109,進(jìn)行如上所述處理。
圖12表示當(dāng)使用如圖8所述SAX呈現(xiàn)器實(shí)現(xiàn)時(shí),使用根據(jù)本發(fā)明的翻譯器格式保存XML文檔的方法。在步驟1200,處理開始。在步驟1201,發(fā)出用于存儲(chǔ)資源的請求。該請求可來自多個(gè)資源,例如,在集成開發(fā)環(huán)境中(IDE)將XML文件保存在編輯器中的用戶請求。在步驟1202中,將保存處理委托于SAX呈現(xiàn)器,在步驟1203,從資源檢索根翻譯器,如前面參照圖11所述。在步驟1204,將當(dāng)前翻譯器設(shè)置成等于根翻譯器。由于為了呈現(xiàn)XML文檔的內(nèi)容而必須遍歷翻譯器樹,從而當(dāng)前翻譯器作為樹中的位置的指示。在遞歸實(shí)現(xiàn)中,當(dāng)前翻譯器為調(diào)用堆棧中當(dāng)前方法的翻譯器參數(shù)。在步驟1205中,獲得下一個(gè)子翻譯器。從當(dāng)前翻譯器獲得子翻譯器列表,對每個(gè)子翻譯器開始進(jìn)行迭代處理。
在步驟1206,確定是否具有另一現(xiàn)存子翻譯器,即,是否到達(dá)了子翻譯器列表的末端。如果不存在另一子翻譯器,則處理進(jìn)行到步驟1215,在此確定當(dāng)前翻譯器是否具有父翻譯器。如果在步驟1215確定出當(dāng)前翻譯器具有父翻譯器,則處理進(jìn)行到步驟1216,在此將當(dāng)前翻譯器設(shè)置成等于父翻譯器,然后,處理返回到步驟1205。如果在步驟1215確定出當(dāng)前翻譯器沒有父翻譯器,則這表明當(dāng)前翻譯器為根翻譯器,而且遍歷了所有子翻譯器。因此,遍歷了資源的全部對象模型,從而完成處理。
如果在步驟1206確定存在下一個(gè)子翻譯器,則處理進(jìn)行到步驟1207,在此確定下一個(gè)子翻譯器是否由父翻譯器管理。如果確定出下一個(gè)子翻譯器由父翻譯器管理,則處理進(jìn)行到步驟1208,在此將該翻譯器用于獲取模型值,并進(jìn)行任何轉(zhuǎn)換。使用翻譯器的元模型信息將對象模型上的特征值轉(zhuǎn)換成字符串表示,以便在XML中進(jìn)行串行化。在定制翻譯器的情形中,可覆蓋“convertObjectToString()”方法來執(zhí)行定制邏輯,以便將對象值翻譯成字符串。然后,處理進(jìn)行到步驟1209,在此使用轉(zhuǎn)換值呈現(xiàn)XML,然后,處理返回到步驟1205。
如果在步驟1207確定出下一個(gè)子翻譯器不由父翻譯器管理,則處理進(jìn)行到步驟1211,在此使用子翻譯器來獲得子模型對象。使用與子翻譯器相關(guān)聯(lián)的結(jié)構(gòu)特征中的元模型信息,來獲得子模型對象。然后,處理進(jìn)行到步驟1212,在此使用該翻譯器從模型對象獲取XML節(jié)點(diǎn)的名稱和值。將翻譯器與其XML節(jié)點(diǎn)名相關(guān)聯(lián)。在多數(shù)情形中,該名稱對于給定翻譯器是恒定的。然而,存在有同樣的翻譯器可基于對象類型返回不同節(jié)點(diǎn)名的某些情形。根據(jù)企業(yè)級JavaBean規(guī)范(SunMicrosystems公司),一個(gè)示例是在文件EJB-JAR.XML中“enterprise-beans”元素的子節(jié)點(diǎn)。子元素可為“entity(實(shí)體)”或“session(會(huì)話)”。
然后,處理進(jìn)行到步驟1213,在此使用轉(zhuǎn)換值呈現(xiàn)XML。在步驟1214,將當(dāng)前翻譯器設(shè)置成等于子翻譯器,然后處理返回到步驟1205,在此,關(guān)于子模型對象和子翻譯器,重復(fù)該處理。
最后,圖13根據(jù)本發(fā)明優(yōu)選實(shí)施例表示使用如圖5所示DOM呈現(xiàn)器實(shí)現(xiàn)保存XML文檔的處理。在步驟1300,處理開始。在步驟1301,發(fā)出用于保存資源的請求。在步驟1302,將保存處理委托于DOM呈現(xiàn)器,在步驟1303,確定DOM是否存在。在最初將該資源從XML文檔載入(如圖11所述)且在解析步驟期間由呈現(xiàn)器創(chuàng)建出DOM的情形中,DOM可能已經(jīng)存在。如果DOM不存在,這表示它是“新”的資源,且其對象模型內(nèi)容被創(chuàng)建出但并未保存到文檔。
如果DOM確實(shí)存在,則處理進(jìn)行到步驟1319,在此通過用于DOM串行化的眾所周知API,將現(xiàn)有DOM串行化到文件或其他輸出介質(zhì)。如果DOM存在,根據(jù)美國專利6,745,208的教導(dǎo),假設(shè)DOM與對象模型的內(nèi)容同步。然后,處理進(jìn)行到步驟1320,在此完成處理。
如果在步驟1303確定出DOM不存在,則處理進(jìn)行到步驟1304,在此從資源獲得根翻譯器。在步驟1305,使用根翻譯器、資源和DOM,創(chuàng)建根適配器。由于不存在任何DOM,從而呈現(xiàn)器首先創(chuàng)建新的XML文檔實(shí)例。文檔為根層次DOM節(jié)點(diǎn)以便與根適配器相關(guān)聯(lián)。然后,創(chuàng)建根適配器。
在步驟1306,將當(dāng)前適配器設(shè)置成等于根適配器,在步驟1307,若有可能,獲得下一個(gè)子翻譯器。在步驟1308,確定下一個(gè)子翻譯器是否存在。
如果在1308確定出不存在下一個(gè)子翻譯器,則處理進(jìn)行到步驟1317,在此確定當(dāng)前適配器是否具有父適配器。如果當(dāng)前適配器的確具有父適配器,則處理進(jìn)行到步驟1318,在此將當(dāng)前適配器設(shè)置成等于父適配器。如果在步驟1317確定出當(dāng)前適配器不具有父適配器,則處理進(jìn)行到步驟1319,在此使用現(xiàn)有DOM串行化功能執(zhí)行如上說述的保存操作。
如果在步驟1308確定出確實(shí)存在下一個(gè)子翻譯器,則處理進(jìn)行到步驟1309,在此確定它是否由父翻譯器管理。如果它是由父翻譯器進(jìn)行管理,則處理進(jìn)行到步驟1310,在此使用子翻譯器獲取模型值并執(zhí)行任何轉(zhuǎn)換,然后,處理進(jìn)行到步驟1311,在此使用轉(zhuǎn)換值呈現(xiàn)XML,從而,該適配器將對與當(dāng)前適配器相關(guān)聯(lián)的節(jié)點(diǎn)進(jìn)行值的設(shè)置,且處理返回到步驟1307。
如果在步驟1309確定出下一個(gè)子翻譯器不由父翻譯器管理,則處理進(jìn)行到步驟1312,在此,利用來自與子翻譯器相關(guān)聯(lián)的結(jié)構(gòu)特征的元模型信息,將該翻譯器用于獲取子模型對象。然后,處理進(jìn)行到步驟1313,在此對每個(gè)子對象創(chuàng)建適配器。由于父對象的子對象將具有復(fù)雜類型,還需對對象進(jìn)行修改,對于子對象需重復(fù)該處理。如果與子翻譯器相關(guān)聯(lián)的結(jié)構(gòu)特征是單值的,則將僅具有一個(gè)子對象。如果結(jié)構(gòu)特征是多值的,則將具有零或多個(gè)子對象,且在此情形中修改每個(gè)子對象然后,處理進(jìn)行到步驟1314,在此使用眾知API創(chuàng)建新的適配器,然后處理進(jìn)行到步驟1315,在此將當(dāng)前適配器設(shè)置成等于在步驟1313中創(chuàng)建的新適配器,然后,處理返回到步驟1307,在此將對與新當(dāng)前適配器相關(guān)聯(lián)的子翻譯器進(jìn)行迭代處理,如以上所述。
使用上述處理,根據(jù)本發(fā)明示出使用基于SAX的API或基于DOM的API將對象模型載入和保存為XML文檔的優(yōu)選實(shí)施例。在圖10和12中,示出了SAX呈現(xiàn)器實(shí)現(xiàn),在圖11和13中,示出了DOM呈現(xiàn)器實(shí)現(xiàn)。通過使用翻譯器分離模型到XML轉(zhuǎn)換的邏輯,該公共邏輯為兩種實(shí)現(xiàn)所重用。應(yīng)用開發(fā)人員能夠使用本發(fā)明創(chuàng)建所需的其他呈現(xiàn)器。
本發(fā)明假設(shè)使用元模型,即,描述對象模型以及在該模型中不同對象彼此如何相關(guān)的模型。這是現(xiàn)有技術(shù)系統(tǒng)中眾知的方法。該元模型的示例包括EMF建??蚣芎蚃AVA bean。從而,翻譯器基本是XML中的標(biāo)簽名與元模型特征之間的映射,以及使用元模型特征在值與XML之間來回轉(zhuǎn)換所需的相關(guān)行為。當(dāng)具有描述對象模型的元模型時(shí),也就具有描述XML的表格和標(biāo)簽名的XML元數(shù)據(jù)。這可采用DTD或XSD的形式。當(dāng)設(shè)計(jì)系統(tǒng)時(shí),將從XML到元模型元數(shù)據(jù)的映射編碼為翻譯器類,其或是通用的,或是定制的,且通過手工或自動(dòng)化工具生成。當(dāng)處理XML文件并將其載入到“資源”中時(shí),訪問根翻譯器。對于某資源類型(例如,ejb-jar.xml),若第一次請求翻譯器,則從編碼類創(chuàng)建實(shí)際翻譯器實(shí)例,并在系統(tǒng)中將其緩沖。在優(yōu)選實(shí)施例中,通過使用“可變翻譯器工廠”,可對還未進(jìn)行映射的未識(shí)別標(biāo)簽進(jìn)行“實(shí)時(shí)(on the fly)”處理。
由于每個(gè)翻譯器包含有關(guān)于如何將XML模型轉(zhuǎn)換到對象模型以及如何將對象模型轉(zhuǎn)換到XML的信息和規(guī)則,從而,它不依賴于將要使用的具體呈現(xiàn)器,無論它是SAX,DOM,還是某些其他呈現(xiàn)器。在翻譯器中包含了所有進(jìn)行映射的復(fù)雜規(guī)則,從而,若需要進(jìn)行改變,在翻譯器層次實(shí)現(xiàn)改變。這使得翻譯器變得可通用,除非在極少情形中,需要執(zhí)行復(fù)雜邏輯以便進(jìn)行翻譯。要處理這樣的情形,需對這些具體翻譯輸入定制規(guī)則。即便在定制情形中,翻譯器本身也不含有SAX,DOM或其他呈現(xiàn)機(jī)制的“知識(shí)”,哪怕是僅知道如何去執(zhí)行轉(zhuǎn)換,從而,翻譯器為所有呈現(xiàn)實(shí)施例所共享。
在現(xiàn)有技術(shù)系統(tǒng)中,在適配器中封裝了翻譯器的功能,這使得用戶受到限制,對于DOM翻譯要使用DOM模型,對于SAX翻譯要使用SAX模型,等等。在本發(fā)明中,DOM的工作已與翻譯規(guī)則相分離。
從而,本發(fā)明無需從適配器對兩個(gè)域的映射邏輯的綁定以及將其設(shè)置在通用對象(翻譯器)中。這使得能夠使用不同的解析機(jī)制,可以或不必使域一直保持同步,即,系統(tǒng)非常靈活。映射邏輯可以重用,以使得在任何特定條件下使解析器/呈現(xiàn)器都最佳運(yùn)行,不必為適合解析實(shí)現(xiàn)方式而重寫所有映射邏輯。
在現(xiàn)有技術(shù)中,確定給定XML標(biāo)簽名的元模型特征的邏輯與解析機(jī)制(例如,SAX,DOM等)緊密耦合在一起。即使從同一XML文件構(gòu)建同樣的對象模型,由于各種解析器操作的方式不同,從而實(shí)現(xiàn)方式也有很大差別。這導(dǎo)致在不同機(jī)制之間產(chǎn)生許多不一致,這是因?yàn)?,由于處理XML值以及將它們轉(zhuǎn)換到對象模型的代碼是分開編寫的,且在時(shí)間上不一致,導(dǎo)致從標(biāo)簽名到元模型特征的映射信息通常不同。此外,當(dāng)在一個(gè)解析路徑中發(fā)現(xiàn)問題時(shí),在每個(gè)實(shí)現(xiàn)中必須分別對其進(jìn)行修改。
在本發(fā)明中,可使用數(shù)個(gè)不同的解析機(jī)制從同一XML文件載入同樣的對象模型。然而,用于將XML標(biāo)簽名映射到元模型特征的邏輯是由預(yù)編碼的翻譯器類初始化的,并被放置在翻譯器的樹形結(jié)構(gòu)中,然后該樹形結(jié)構(gòu)為不同解析實(shí)現(xiàn)所共享。從而,當(dāng)映射邏輯出現(xiàn)問題時(shí),對適當(dāng)?shù)姆g器進(jìn)行一個(gè)改變,所有解析實(shí)現(xiàn)都獲得該改變。該機(jī)制還允許快速添加另一解析機(jī)制,而不必再去考慮所有XML標(biāo)簽到元模型特征的映射。
在使用現(xiàn)有技術(shù)機(jī)制的多種情形中,使用不同實(shí)現(xiàn)(例如,SAXAPI與DOM API相對比)生成的總對象模型基本相同;然而,不同的方法需先后執(zhí)行映射處理。該雙路徑處理效率較低。
利用本發(fā)明,對象模型所要使用的關(guān)于每個(gè)XML標(biāo)簽到具體結(jié)構(gòu)特征的映射基本上是預(yù)先被執(zhí)行,從而,基本可從翻譯器選擇XML標(biāo)簽/結(jié)構(gòu)特征對,而不管所使用的解析方法。實(shí)際上,映射變得可通用,且可在所有平臺(tái)上使用。在所有情形中,解析器識(shí)別具體標(biāo)簽名,翻譯器將該標(biāo)簽名與結(jié)構(gòu)特征相關(guān),然后利用該信息創(chuàng)建適當(dāng)?shù)膶ο竽P突騒ML呈現(xiàn)。
上述步驟可使用標(biāo)準(zhǔn)的眾所周知的編程技術(shù)來實(shí)現(xiàn)。上述實(shí)施例的新穎性不在于特定編程技術(shù),而在于所述用于實(shí)現(xiàn)所述結(jié)果的步驟的使用。體現(xiàn)本發(fā)明的軟件編程代碼通常存儲(chǔ)在某種永久性存儲(chǔ)設(shè)備中。在客戶機(jī)/服務(wù)器環(huán)境中,可使用與服務(wù)器相關(guān)聯(lián)的存儲(chǔ)設(shè)備存儲(chǔ)這樣的軟件編程代碼。該軟件編程代碼可體現(xiàn)在用于數(shù)據(jù)處理系統(tǒng)的多種公知介質(zhì)(如,磁盤,或硬盤驅(qū)動(dòng)器,或CD-ROM)中的任何介質(zhì)上。該代碼可在這樣的介質(zhì)上進(jìn)行發(fā)布,或在某種網(wǎng)絡(luò)上從一個(gè)計(jì)算機(jī)系統(tǒng)的內(nèi)存或存儲(chǔ)設(shè)備到其他計(jì)算機(jī)系統(tǒng)向用戶發(fā)布,以便為其他系統(tǒng)用戶使用。在物理介質(zhì)上體現(xiàn)軟件程序代碼和/或通過網(wǎng)絡(luò)發(fā)布軟件代碼的技術(shù)和方法是公知,在此將不再進(jìn)行討論。
應(yīng)該理解,通過執(zhí)行特定功能或步驟的普通和/或?qū)S玫幕谟布到y(tǒng),或普通和/或?qū)S糜布陀?jì)算機(jī)指令的組合,可實(shí)現(xiàn)圖中的每個(gè)元素,以及圖中元素的組合。
可將這些程序指令提供給處理器以產(chǎn)生機(jī)器,使得在處理器上執(zhí)行的指令產(chǎn)生出用于實(shí)現(xiàn)說明中指定的功能的裝置。該計(jì)算機(jī)程序指令可由處理器執(zhí)行,以導(dǎo)致一系列操作步驟由該處理器執(zhí)行,產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,以使得在處理器上執(zhí)行的指令提供用于實(shí)現(xiàn)說明中指定的功能的步驟。
盡管參照其中的具體優(yōu)選實(shí)施例描述了本發(fā)明,不過,本領(lǐng)域技術(shù)人員可提出多種改變和修改,由于這樣的改變和修改未偏離所附權(quán)利要求的范圍,從而,本發(fā)明意在將它們包括在內(nèi)。
權(quán)利要求
1.一種從對象模型呈現(xiàn)XML和/或從XML呈現(xiàn)對象模型的方法,包括定義所述XML的每個(gè)XML標(biāo)簽到相關(guān)聯(lián)對象模型特征的公共的、獨(dú)立于解析器的映射;以及定義通用于所有公共映射的兩個(gè)或更多個(gè)特定于解析器的呈現(xiàn)器;其中,所述定義的特定于解析器的呈現(xiàn)器使用特定于解析器的實(shí)現(xiàn)并結(jié)合公共映射來呈現(xiàn)對象模型,以將XML翻譯成對象模型實(shí)例;以及使用特定于解析器的實(shí)現(xiàn)并結(jié)合公共映射來呈現(xiàn)XML,以將對象模型實(shí)例翻譯成XML。
2.根據(jù)權(quán)利要求1的方法,其中,將每個(gè)XML標(biāo)簽到描述每個(gè)相關(guān)聯(lián)對象模型特征的元模型特征的所述映射編碼到翻譯器類中。
3.根據(jù)權(quán)利要求2的方法,其中,所述對象模型特征包括以下其中之一關(guān)于對象類型的簡單屬性;和在所述對象模型中到另一相關(guān)“子”對象的關(guān)聯(lián)。
4.根據(jù)權(quán)利要求3的方法,其中,所述翻譯器類包含對子翻譯器的引用,從而形成與所述對象模型相對應(yīng)的樹形結(jié)構(gòu)。
5.根據(jù)權(quán)利要求3的方法,其中,所述翻譯器類包括用于在XML數(shù)據(jù)與對象模型數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換的可執(zhí)行代碼。
6.根據(jù)權(quán)利要求5的方法,其中,所述翻譯器類包括通用翻譯器類,其使用所述映射信息以及一個(gè)或多個(gè)預(yù)定的缺省處理,執(zhí)行所述轉(zhuǎn)換;和定制翻譯器類,其使用定制的可執(zhí)行代碼執(zhí)行所述轉(zhuǎn)換。
7.一種用于根據(jù)XML呈現(xiàn)對象模型的方法,包括定義所述XML的每個(gè)XML標(biāo)簽到相關(guān)聯(lián)對象模型特征的公共的、獨(dú)立于解析器的映射;使用特定于解析器的實(shí)現(xiàn)解析XML;以及使用公共的、獨(dú)立于解析器的映射,對所述解析的結(jié)果進(jìn)行翻譯,以呈現(xiàn)對象模型。
8.根據(jù)權(quán)利要求7的方法,其中,定義步驟包括將每個(gè)XML標(biāo)簽映射到描述每個(gè)相關(guān)聯(lián)對象模型特征的元模型特征。
9.根據(jù)權(quán)利要求8的方法,其中,將每個(gè)XML標(biāo)簽到描述每個(gè)相關(guān)聯(lián)對象模型特征的元模型特征的所述映射編碼到翻譯器類中。
10.根據(jù)權(quán)利要求8的方法,其中,所述對象模型特征包括以下其中之一關(guān)于對象類型的簡單屬性;和在所述對象模型中到另一相關(guān)“子”對象的關(guān)聯(lián)。
11.根據(jù)權(quán)利要求10的方法,其中,所述翻譯器類包含對子翻譯器的引用,從而形成與所述對象模型相對應(yīng)的樹形結(jié)構(gòu)。
12.根據(jù)權(quán)利要求10的方法,其中,所述翻譯器類包括用于在XML數(shù)據(jù)與對象模型數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換的可執(zhí)行代碼。
13.根據(jù)權(quán)利要求12的方法,其中,所述翻譯器類包括通用翻譯器類,其使用所述映射信息以及一個(gè)或多個(gè)預(yù)定的缺省處理,執(zhí)行所述轉(zhuǎn)換;和定制翻譯器類,其使用定制的可執(zhí)行代碼執(zhí)行所述轉(zhuǎn)換。
14.一種用于根據(jù)對象模型呈現(xiàn)XML的方法,包括定義每個(gè)對象模型特征到所述XML的相關(guān)聯(lián)XML標(biāo)簽的公共的、獨(dú)立于解析器的映射;使用特定于解析器的實(shí)現(xiàn)解析XML;以及使用公共的、獨(dú)立于解析器的映射,遍歷所述對象模型,以生成所述XML的相關(guān)聯(lián)XML標(biāo)簽。
15.根據(jù)權(quán)利要求14的方法,其中,定義步驟包括將描述每個(gè)對象模型特征的元模型特征映射到每個(gè)相關(guān)聯(lián)的XML標(biāo)簽。
16.根據(jù)權(quán)利要求15的方法,其中,將描述每個(gè)相關(guān)聯(lián)對象模型特征的元模型特征到每個(gè)XML標(biāo)簽的所述映射編碼到翻譯器類中。
17.根據(jù)權(quán)利要求16的方法,其中,所述翻譯器類包含對子翻譯器的引用,從而形成與所述對象模型相對應(yīng)的樹形結(jié)構(gòu)。
18.根據(jù)權(quán)利要求14的方法,其中,所述對象模型特征包括以下其中之一關(guān)于對象類型的簡單屬性;和在所述對象模型中到另一相關(guān)“子”對象的關(guān)聯(lián)。
19.根據(jù)權(quán)利要求18的方法,其中,所述翻譯器類包括用于在XML數(shù)據(jù)與對象模型數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換的可執(zhí)行代碼。
20.根據(jù)權(quán)利要求19的方法,其中,所述翻譯器類包括通用翻譯器類,其使用所述映射信息以及一個(gè)或多個(gè)預(yù)定的缺省處理,執(zhí)行所述轉(zhuǎn)換;和定制翻譯器類,其使用定制的可執(zhí)行代碼執(zhí)行所述轉(zhuǎn)換。
21.一種用于從對象模型呈現(xiàn)XML和/或從XML呈現(xiàn)對象模型的系統(tǒng),包括用于定義所述XML的每個(gè)XML標(biāo)簽到相關(guān)聯(lián)對象模型特征的公共的、獨(dú)立于解析器的映射的裝置;以及用于定義通用于所有公共映射的兩個(gè)或更多個(gè)特定于解析器的呈現(xiàn)器的裝置;其中,所述定義的特定于解析器的呈現(xiàn)器使用特定于解析器的實(shí)現(xiàn)并結(jié)合公共映射來呈現(xiàn)對象模型,以將XML翻譯成對象模型實(shí)例;以及使用特定于解析器的實(shí)現(xiàn)并結(jié)合公共映射來呈現(xiàn)XML,以將對象模型實(shí)例翻譯成XML。
22.根據(jù)權(quán)利要求21的系統(tǒng),其中,將每個(gè)XML標(biāo)簽到描述每個(gè)相關(guān)聯(lián)對象模型特征的元模型特征的所述映射編碼到翻譯器類中。
23.根據(jù)權(quán)利要求22的系統(tǒng),其中,所述對象模型特征包括以下其中之一關(guān)于對象類型的簡單屬性;和在所述對象模型中到另一相關(guān)“子”對象的關(guān)聯(lián)。
24.根據(jù)權(quán)利要求23的系統(tǒng),其中,所述翻譯器類包含對子翻譯器的引用,從而形成與所述對象模型相對應(yīng)的樹形結(jié)構(gòu)。
25.根據(jù)權(quán)利要求23的系統(tǒng),其中,所述翻譯器類包括用于在XML數(shù)據(jù)與對象模型數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換的可執(zhí)行代碼。
26.根據(jù)權(quán)利要求25的系統(tǒng),其中,所述翻譯器類包括通用翻譯器類,其使用所述映射信息以及一個(gè)或多個(gè)預(yù)定的缺省處理,執(zhí)行所述轉(zhuǎn)換;和定制翻譯器類,其使用定制的可執(zhí)行代碼執(zhí)行所述轉(zhuǎn)換。
27.根據(jù)權(quán)利要求1的方法,其中所述兩個(gè)或更多個(gè)特定于解析器的呈現(xiàn)器均能處理所述XML;以及所述兩個(gè)或更多個(gè)特定于解析器的呈現(xiàn)器均能處理所述對象模型。
28.根據(jù)權(quán)利要求1的方法,其中,所述兩個(gè)或更多個(gè)特定于解析器的呈現(xiàn)器在運(yùn)行系統(tǒng)中均可被動(dòng)態(tài)替換。
全文摘要
本發(fā)明在對象模型與XML之間雙向轉(zhuǎn)換的方面,引出了“呈現(xiàn)器”和“翻譯器”的概念。呈現(xiàn)器包括用于在讀出與寫入XML的特定于解析器的API間起中介作用的邏輯。它使用多個(gè)翻譯器對象,翻譯器對象包括將XML轉(zhuǎn)換成對象模型實(shí)例所需要的映射信息。翻譯器對象本身不包含關(guān)于解析器實(shí)現(xiàn)的“知識(shí)”;從而,翻譯器是公共的,能夠?yàn)槿魏吻宜谐尸F(xiàn)器實(shí)現(xiàn)所共享和重用。由于每個(gè)翻譯器包括關(guān)于如何將XML模型轉(zhuǎn)換成對象模型以及如何將對象模型轉(zhuǎn)換成XML的信息和規(guī)則,從而,它獨(dú)立于將要使用的具體呈現(xiàn)器,無論它是SAX,DOM,還是某些其他呈現(xiàn)器。
文檔編號G06F17/30GK1783090SQ200510127039
公開日2006年6月7日 申請日期2005年11月29日 優(yōu)先權(quán)日2004年11月30日
發(fā)明者丹尼爾·伯格, 邁克爾·D·埃德爾, 德里克·F·霍爾特, L·斯科特·里奇, 理查德·L·沙徹 申請人:國際商業(yè)機(jī)器公司