DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集
編輯:XML詳解     

 現在已經為交換創建了一個 UML 模型(參見 第 1 部分),下一步是將模型映射到 NIEM,以便確定消息中將重用 NIEM 的哪些組成部分。映射過程通常在一個稱為組件映射模板(Component Mapping Template,CMT)的電子表格中完成。CMT 用處很大,這主要是因為以下幾點:

  它為交換提供了一個詳細的、人類可讀的定義,並為注釋和額外的文檔描述預留了位置。

  它明確指出模型的哪些組成部分重用 NIEM 組件,哪些組成部分是 InformationExchange Package Documentation (IEPD) 特有的。

  它能夠在制作 NIEM 模型的子集時充當一個方便的核對清單。

  創建組件映射模板

  常用縮寫詞

  CMT: 組件映射模板

  IEPD: 信息交換包文檔

  NIEM: 國家信息交換模型

  SSGT: NIEM 架構子集生成工具

  UML: 統一建模語言

  XML: 可擴展標記語言

  CMT 通常在 Microsoft® Office Excel® 或其他電子表格軟件(比如 OpenOffice.org Calc)中創建。但是,CMT 可以使用任意表格格式創建。CMT 沒有固定的格式,但是一個典型的 CMT (最少)包含以下幾列:

  源類型:UML 模型中類的名稱。

  源屬性:UML 模型中屬性的名稱。

  數據類型:屬性的數據類型。

  說明:類型或屬性的簡短說明。

  基數:允許出現的屬性的數量。

  擴展指示符:模型是否匹配 NIEM 模型中的一個組件。

  XPath:到 XML 消息中元素的路徑。

  有些 NIEM 實現者向 CMT 添加更多列來表示擴展 NIEM 的細節,本系列第 3 部分將深入探究擴展 NIEM。

  在 CMT 中記錄模型

  第一步是在 CMT 的前 5 列中記錄 UML 模型。本系列 第 1 部分 介紹了一個簡單的示例案例的 UML 圖表,該案例涉及報告已注冊車輛的失竊情況。根據那個 UML 類圖表 — 再次展示在 圖 1 中 — 表 1 顯示了 CMT 格式的 TheftLocation 類。為節約空間,表 1 中省略了說明,您可以從 下載 部分獲取一個完成的示例 CMT。

圖 1. 第 1 部分中的 UML 模型圖表
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

表 1. 在 CMT 中表示一個類型和一些屬性

源類型 源屬性 數據類型 說明 基數 TheftLocation     ...   TheftLocation Address String ... 0..1 TheftLocation City String ... 0..1 TheftLocation State String ... 0..1 TheftLocation ZipCode String ... 0..1 TheftLocation CountyCode CountyCode ... 0..1

  在數據類型列中,使用了 XML Schema 簡單類型名稱。如果是代碼列表,那麼需要指定一個代碼列表名稱,而有效值則記錄在電子表格的另一個標簽中。基數顯示最小和最大出現次數,其中 * 表示一個無限大的數量。

  每個關聯都應該在 CMT 中擁有一行,並用幾行來表示對該關聯中涉及的類型的引用。表 2 展示了 Theft/TheftLocation 關聯的一個 CMT 表示。

表 2. 在 CMT 中表示一個關聯

源類型 源屬性 數據類型 說明 基數 Theft / TheftLocation Assn         Theft / TheftLocation Assn Theft Reference ... 1..1 Theft / TheftLocation Assn TheftLocation Reference ... 1..1

  角色類型應該使用一些引用來展示,這些引用的范圍涵蓋角色到擔任該角色的類型。表 3 中的 Witness 角色類型包含一個對 Person 的引用,標注為 RoleOfPerson。

表 3. 在 CMT 中表示一個角色

源類型 源屬性 數據類型 說明 基數 Witness         Witness Account String ... 0..1 Witness RoleOfPerson Reference ... 1..1

  搜索 NIEM 等價元素

  映射交換的下一個任務是確定您的模型和 NIEM 重疊的位置,並在 CMT 中記錄那些元素。應該盡量重用 NIEM,以便最大化與其他 NIEM 應用程序的互操作性。如果一個 IEPD 在 NIEM 模型中已存在語義上等價的組件時仍添加新組件,那麼這個 IEPD 就是不遵守 NIEM 的。也就是說,如果數據的確不適合 NIEM,那麼不應該將該數據強行添加到 NIEM 中。本系列第 3 部分將解釋如何向 NIEM 模型添加新組件。

  由於 NIEM 模型非常大,您肯定不會希望手動掃描架構來尋找匹配的組件。幸運的是,有幾個在線工具可用於找到 NIEM 模型中的匹配組件(參見 參考資料 獲取這些工具的鏈接):

  NIEM Wayfarer。使用這個工具,能夠搜索 NIEM 組件,並以一個組件一頁的方式遍歷 NIEM 模型。

  Schema Central。這個工具的功能類似於 NIEM Wayfarer,但適用於各種 XML 詞匯表,而不僅僅是 NIEM。

  NIEM Schema Subset Generation Tool (SSGT)。使用這個工具,能夠以稍微圖形化一些的方式搜索並導航 NIEM 模型。一旦發現感興趣的組件,這個工具還提供生成 NIEM 子集的附加功能。

  使用上述工具在 CMT 中尋找 NIEM 中可能已經存在的所有組件。例如,在 Schema Central 中搜索詞匯 Vehicle 時,將會看到 圖 2 中的搜索結果頁面。

圖 2. Schema Central 搜索結果頁面
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  單擊 nc:Vehicle,將顯示 圖 3 中的頁面,其中顯示有該元素的一些一般特征,以及可能的子元素的完整列表。

圖 3. Schema Central 元素顯示頁面
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  所有的 NIEM 組件都有一個名稱空間前綴 nc,表示 NIEM Core,這是其中駐留有最基本的類型的名稱空間。每個域都有一個名稱空間(例如,j 表示 Justice)。可以放心地使用任何域中的 NIEM 組件,只要它們與您的模型在語義上對等。不必為了使用 immigration 域中的一個元素而特意實現一個與 immigration 相關的交換。

  NIEM 模型搜索指南

  不管使用何種工具,都可以通過以下技巧使得搜索 NIEM 模型更為輕松:

  比較容易的方法通常是首先尋找級別最高的類型/類(在示例案例中為 Theft、Property、Location 等),然後尋找適當的屬性。

  不要忘了搜索同義詞。如果找不到 License Plate,可以嘗試尋找 Registration。

  如果找不到具體組件,可以尋找更通用的組件。NIEM 中的一些最通用的類型是 Person、Organization、Location、Activity 和 Item。例如,如果找不到 Theft Location,可以尋找更通用的 Location 並使用 nc:Location。如果沒有 Theft 的具體類型,可以考慮使用更通用的 nc:Activity。

  不要只搜索名稱。如果將搜索范圍擴展到說明和枚舉,可能會找到適當的類型。

  尋找 NIEM 模型中的組件最初可能令人望而生畏,但隨著您逐漸熟悉 NIEM 模型的常用命名和構造模式,搜索過程就會變得更加簡單。

  在 CMT 中記錄 NIEM 組件

  找到一個對等 NIEM 組件後,應將它記錄在 CMT 中的 XPath 列中。通常要使用簡單的 XPath 表達式 — 元素和/或屬性名稱以斜槓(/)分隔。類型名稱不需要包含在 XPath 中。使用名稱空間前綴(比如 nc:),因為元素名稱在不同的名稱空間之間不一定是惟一的。

  表 4 展示了 TheftLocation 的 XPath 映射。注意:為了更美觀,較長的 XPath 映射分割為表格中的多個行,但映射通常是單個字符串。

表 4. TheftLocation XPath 映射

源類型 源屬性 ... Ext? XPath TheftLocation   ...   nc:Location TheftLocation Address ... N nc:Location/nc:LocationAddress /nc:StructuredAddress 
/nc:LocationStreet /nc:StreetFullText TheftLocation City ... N nc:Location/nc:LocationAddress /nc:StructuredAddress 
/nc:LocationCityName TheftLocation State ... N nc:Location/nc:LocationAddress /nc:StructuredAddress 
/nc:LocationState USPostalServiceCode TheftLocation Zip ... N nc:Location/nc:LocationAddress /nc:StructuredAddress 
/nc:LocationPostalCode TheftLocation CountyCode ... Y  

  XPath 中應該包含足夠的步驟,以便惟一地識別它。例如,不要僅僅在行中放置 nc:StreetFullText 來表示 Address。有時,多條路徑可能會到達 NIEM 中的一個元素,因此,為精確起見,需要完整的路徑。

  在本例中,CountyCode 屬性(一個特定於州的區縣代碼)在 NIEM 中不存在,因此它需要一個擴展。因此,Ext? 列設置為 Y,且 XPath 目前為空白。本系列的第 3 部分將詳細介紹為擴展填充 XPath 的過程。

  要查看從 Theft Report 示例模型到 NIEM 的完整映射,請參見 下載 部分提供的電子表格。

  創建 NIEM 子集

  決定在交換中使用 NIEM 的哪些組件之後,就可以創建 NIEM 模型的子集,其形式為一組 XML Schema 文檔。由於完整的 NIEM 模型非常大、其約束非常松散,因此一個 NIEM 子集是很必要的,可以更精確地驗證您的交換。NIEM 子集限制允許的元素和屬性,它們可以出現的次數,以及 —在某些情況下— 它們允許的值。創建一個 NIEM 子集還能加速 XML 消息的驗證,因為其架構要小得多。

  我們使用 NIEM SSGT 創建 NIEM 子集。圖 4 中 SSGT 的初始頁面包含兩個窗格:右邊的窗格用於搜索和導航 NIEM 模型,左邊的窗格用於在您添加組件時顯示子集。

圖 4. SSGT 主頁面
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  根據您的 CMT 執行一些搜索,找到一些組件並將其添加到子集中。使用 SSGT,可以選擇搜索屬性(元素或屬性名稱)、類型、關聯或其他組件。由於 CMT 中有元素名稱,因此搜索屬性更明智。樣例搜索結果如 圖 5 所示。

  您可能會感到奇怪:既然可以在同一個工具(SSGT)中執行映射和子集創建任務,那麼映射和子集創建為何還是兩個獨立的步驟?使用 SSGT,同時執行映射和子集創建操作是完全可能的。但是,許多 NIEM 從業人員發現,使用 NIEM Wayfarer 或 Schema Central 進行映射更簡單,它們能更清晰地顯示實際(或扁平)的類型結構。使用 SSGT 進行導航需要更多 NIEM 知識(和更多鼠標單擊),因此,在准備好一個准確列出您想要的組件的 CMT 之後再選擇使用 SSGT 能夠使子集創建操作更高效。

圖 5. SSGT 搜索結果頁面
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  向子集添加屬性

  當顯示出感興趣的 NIEM 組件時,單擊 Add 將其添加到子集。然後,它將出現在左邊窗格中的 NIEM Schema Subset 下方,如 圖 6 所示。

  添加屬性時,將自動添加屬性類型。例如,如果添加 nc:PersonName,nc:PersonNameType 也將自動添加到子集中。顯式選擇的組件將以粗體形式出現在左邊窗格中,旁邊帶有一個復選框,而附屬組件則不以粗體顯示。

圖 6. SSGT 子集
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  SSGT 並不默認添加類型的子屬性。例如,如果添加 nc:PersonName,它不會包含 nc:PersonGivenName 和 nc:PersonSurName 屬性,必須分別添加這些屬性。添加它們時,必須位於 nc:PersonName 上下文中,以便它們(比如 nc:PersonName 和 nc:PersonGivenName)之間的父子關系能夠得以保持。為此,在 SSGT 搜索結果中展開 nc:PersonName 樹,並單擊 nc:PersonGivenName 旁邊的 Add,如 圖 7 所示。

圖 7. 使用 SSGT 添加子元素
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  反之,如果獨立搜索 PersonGivenName 並從搜索結果添加它,那麼該元素將被添加,但不是作為 nc:PersonName 的子元素。

  圖 7 還顯示了,添加類型的屬性時可以指定基數。單擊 Add 按鈕上的向下箭頭將顯示一個下拉菜單,其中顯示出可能的基數。默認值是 0 到無窮大。

  如果一個屬性通過繼承被包含,那麼它默認不顯示在 SSGT 層次中。例如,在 SSGT 搜索結果中展開 nc:Vehicle 不會自動顯示映射到 Property Description 屬性的 nc:ItemDescriptionText。要查看這些繼承屬性,看單擊(nc:VehicleType 旁邊的)show inheritance 並展開包含相關屬性的類型 — 在本例中為 nc:ItemType,如 圖 8 所示。

圖 8. 使用 SSGT 添加繼承屬性
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  抽象元素和子集

  NIEM 模型通常使用 XML Schema 抽象元素和替換組。例如,有幾種方法可以用來表示一個貨物的顏色。NIEM 有一個抽象元素 — nc:ItemColor — 它不能出現在 XML 實例中的任何位置。相反,它必須用幾個元素中的一個來替換,比如 nc:VehicleColorPrimaryCode 或 nc:ItemColorDescriptionText。在 XML Schema 術語中,nc:VehicleColorPrimaryCode 和 nc:ItemColorDescriptionText 稱為一個替換組 的成員,它們的上級 是 nc:ItemColor。

  抽象元素增加了創建子集的復雜性,因為必須在子集中添加可替換的元素,而不只是抽象元素。SSGT 使用單詞 abstract 標記所有抽象元素,並允許您展開它們查看可替換的元素,如 圖 9 所示。

圖 9. 使用 SSGT 添加可替換元素
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  大多數日期相關類型也包含一個抽象元素 nc:DateRepresentation,該元素可用 nc:Date、nc:DateTime 等替換。一個常見的錯誤是簡單地添加一個日期相關屬性,比如 nc:ActivityDate,而不是展開它以單擊 nc:DateRepresentation,然後單擊 nc:Date,從而使用適當的子元素。

  優化子集

  子集創建好之後,可以使用 SSGT 的左邊窗格進行修改。可以刪除任何組件,方法是選擇組件旁邊的復選框,然後單擊 Delete。還可以通過展開左邊窗格中適當的簡單類型來刪除允許的代碼列表值。默認情況下,來自一個簡單類型的所有代碼列表值都包含在子集中。

  還可以通過單擊左邊窗格頂部的 Edit Cardinality 更改基數,這再給您一次機會決定父類型中允許的某個特定屬性的數量。

  此時,您的 NIEM 子集不必完美無缺。NIEM 子集創建通常是一個反復的過程。在 IEPD 開發的最後階段,仍然可以根據需要修改並保存您的子集。

  生成 NIEM 子集

  要生成子集,單擊頁面右上角的 Generate Documents。這將彈出一個類似於 圖 10 的窗口,其中顯示了一些生成選項。選擇 Save Subset Schema to a file,然後選擇存儲位置。

圖 10. 使用 SSGT 生成子集
創建一個 NIEM IEPD,第 2 部分: 映射和 NIEM 子集

  查看原圖(大圖)

  上述操作將創建一個名為 Subset.zip 的 .zip 文件,其中有一個 niem 子文件夾包含 NIEM 子集。這個文件還為每個名稱空間(您在 SSGT 中為名稱空間選擇了元素)包含了一個架構文檔以及所有子集都帶有的幾個標准架構。

  只有您選擇的類型包含在架構文檔中,並且這些類型只包含選擇的屬性。例如,盡管 nc:PersonNameType 在整個 NIEM 模型中擁有 7 個可能的子元素,且它們都擁有基數 0..*,但您的子集架構將只包含 清單 1 中的內容。

清單 1. NIEM 子集中的 nc:PersonNameType

<xsd:complexType name="PersonNameType"> 
 <xsd:complexContent> 
  <xsd:extension base="s:ComplexObjectType"> 
   <xsd:sequence> 
    <xsd:element ref="nc:PersonGivenName" minOccurs="0" maxOccurs="1"/> 
    <xsd:element ref="nc:PersonSurName" minOccurs="0" maxOccurs="1"/> 
   </xsd:sequence> 
  </xsd:extension> 
 </xsd:complexContent> 
</xsd:complexType> 

  這個子集還包含一個名為 wantlist.xml 的 XML 文檔,它列出已添加到子集中的所有元素及其基數。如果稍後要進行修改,這個 wantlist 很有用:可以將這個 wantlist 重新上傳到 SSGT,修改子集,然後重新生成子集。清單 2 顯示了這個 wantlist 的一部分。

清單 2. 部分 NIEM 子集 wantlist

<w:WantList w:release="2.1" w:product="NIEM" ...> 
 <w:Element w:name="j:Person" w:isReference="false"/> 
 <w:Element w:name="j:Witness" w:isReference="false"/> 
 ... 
 <w:Type w:name="j:PersonType" w:isRequested="false"> 
  <w:ElementInType w:minOccurs="0" w:maxOccurs="1" 
   w:name="j:PersonAugmentation" w:isReference="false"/> 
 </w:Type> 
 <w:Type w:name="j:WitnessType" w:isRequested="false"> 
  <w:ElementInType w:minOccurs="0" w:maxOccurs="1" 
   w:name="j:WitnessAccountDescriptionText" w:isReference="false"/> 
  <w:ElementInType w:minOccurs="1" w:maxOccurs="1" 
   w:name="nc:RoleOfPerson" w:isReference="true"/> 
 </w:Type> 
 ... 
</w:WantList> 

  結束語

  本文展示了如何使用 CMT 將 UML 交換模型映射到 NIEM。然後描述了使用 NIEM SSGT 創建 NIEM 子集的過程。在本系列第 3 部分中,將處理還沒有填充的 CMT 行:擴展。將要介紹擴展 NIEM 的不同方法,並帶領您逐步創建 Exchange 和 Extension 架構。

  本文示例源代碼或素材下載

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved