簡介 XMI集成了三種工業標準:W3C組織提出的XML、OMG組織提出的元對象設施MOF(Meta-Object Facility)和UML。XMI標準已經廣泛地集成到各種UMLCASE工具中,如Rational公司著名的軟體工程工具Rose提供了XMI外掛程式,用於引入和導出UML模型,如圖1所示。用戶通過
Rational Rose 的XMI外掛程式導出UML模型並保存為XMI文檔,也可以將UML模型從XMI文檔引入到Rational Rose中。
圖1 Rational Rose軟體中XMI外掛程式——導出UML模型,保存為XMI文檔
XMI是基於XML技術發展起來的一種標記語言,它繼承了XML的所有特徵:XMI是結構化的文檔;XMI中使用的標籤可以擴展;XMI文檔的解析方式有DOM和SAX兩種;XMI使用DTD或XML Schema定義語法。XMI標準是交換UML模型數據的橋樑。
標籤 在XMI的語法中,定義了一些固定的標籤表示UML模型。經常使用的是“XMI.header”和“XMI.content”。通常“XMI.header”標籤所包含的內容是模型的附屬信息,例如該模型的名稱、元模型等。標籤“XMI.content”包含的是實際的模型數據。下面是一個XMI文檔的例子,包含了一個簡單的UML模型。
XMI工具包 IBM公司開發了XMI工具包,並將其套用到Eclipse Modeling Framework(EMF)中。EMF是IBM開發的可將UML模型數據轉換為一系列java類和原始碼的工具。用戶使用IBM公司的XMI工具包從Rational Rose導出的XMI文檔中引入UML模型到EMF中,之後EMF可對引入的UML模型數據進行操作,並能產生Java類和程式代碼。由於IBM EMF和Rational Rose兩種軟體都支持XMI標準,所以任何使用這兩種軟體的公司之間都能實現UML模型的數據交換。
XML元數據交換算法原理 圖2所示描述了 XML元數據交換算法的原理。元數據交換算法包括應用程式、
XML解析器 組件和 XML 模板等部分。其中,XML 解析器組件實現對元數據的讀寫操作,並向應用程式提供若干接口;應用程式可以利用組件提供的接口實現對元數據的寫入和讀取,而無須知道讀寫的細節;XML 模板文檔由應用程式的開發者提供,向組件提供要讀寫變數的詳細信息。XML 模板文檔相當於應用程式和組件共同遵守的一個用來描述元數據信息的規則集,組件可以通過解析 XML 模板文檔來辨別出應用程式中需要交換的元數據信息。應用程式通過調用組件公開的接口來對元數據進行存取操作,而無須知道實現存取的細節。組件根據接口參數傳入的元數據名稱,在 XML 模板文檔中找到相應的元數據信息,然後識別出它的具體信息,從而實現對該元數據的存取。由於組件通過 XML 模板文檔推斷出要交換存取的元數據信息,因此組件端一旦交由應用程式使用,就可以不加改變地交換不同應用程式中的元數據。
圖2: XML 元數據交換算法原理
創建 XML 模板示例 XML 文檔模板的創建原則是各應用程式和組件端之間必須遵循統一規則。電子試卷生成規則的 XML 文檔模板中元數據信息採用類對象描述方式,統一表達為 :
<testDocument> <baseInfo> <courseName></courseName> //課程名稱 <student Name="" stuNo=""></student> //學生姓名與學號 </baseInfo> <pageSetting> <paperSize height="" width=""></paperSize> //紙張大小 <magin top="" bottom="" left="" right=""></magin>//頁邊距 <layout></layout> //紙張方向 </pageSetting> <examInfo> <items count="" score="" type="" lastscore="" num="">//題型、 //小題數量、分值、最終得分、題號 <item score="" lastscore="" num="">//小題、分值與得分、題號 <topic></topic> //題乾 <options count="">//選擇項,非選擇題一般不用此節點 <option></option> </options> <answer type="" doctype=""></answer> //學生答案 <standardanswer type="" doctype=""> </standardanswer> //此題標準答案 <description></description> //教師評判,非客觀題的評分情況說明 </wiki> </wikis> </examInfo> </testDocument> <hashCode> <student></student> //學生交卷後生成的數字簽名 <teacher></teacher> //教師評判後生成的數字簽名 </hashCode> 其中,testDocument 是 XML 文本模板檔案交換元數據部分的開始標籤;baseInfo, pageSetting, examInfo 是 3 個基本類信息標籤,baseInfo 存儲課程名稱與學生基本信息;pageSetting存儲電子試卷的頁面設定信息用於控制試卷的顯示與列印,examInfo 存儲試卷的詳細信息,包括試題信息,學生的作答情況和教師的評判情況;hashCode 標籤用於保存考試試卷的數字簽名信息,保證電子試卷的完整性,防止試卷被惡意篡改。在學生考試過程中生成試卷時,標準答案項與教師評判項標籤均為空,在教師評卷時此類信息才會被加入到試卷中,以供列印或評估時查閱。
存取 XML 元數據的接口函式 各應用程式之間均採用統一規則的 XML 文本流模板作為元數據交換的接口標準,通過 XML 解析器對不同應用程式中的元數據進行解析與處理,此類操作與應用程式本身無關。應用程式與 XML 解析器之間通過接口函式實現數據存儲。該接口函式的形式說明如下:
bool SetKeyValue(XmlDocument xmlDoc, string keyName, string attributeName, string stringValue)
其中,參數 xmlDoc 表示要操作的 XML 文檔;keyName 表示要存儲的節點名;attributeName 表示要設定的節點 keyName中所包含的屬性名;stringValue 為要存儲的數據。
應 用 程 序 通 過 調 用 接 口 函 數 SetKeyValue(xmlDoc,keyName, stringValue)向 XML 解析器傳入參數,XML 解析器在XML模板文檔中搜尋名稱為keyName的元素或元素屬性,找到後再對該元素或其包含的屬性賦值。SetKeyValue 的實現關鍵代碼如下:
XmlNode xmlNode=xmlDoc.SelectSingleNode(keyName); if (attributeName==string.Empty) { xmlNode.InnerText=stringValue; } else { xmlNode.Attributes[attributeName].Value=stringValue; }