亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

在XML模式中擴展枚舉列表

2024-09-05 20:55:29
字體:
來源:轉載
供稿:網友
在列表中添加新值是一種常見而且必要的需求。模式設計者通常希望在系統架構中構建一種添加附加值的方法,并且該附加值在設計階段是未知的。模式設計者如何創建一個可擴展、易于實現的枚舉值列表?本文將介紹幾種實現這一目標的方法。
模式設計者和實現人員需要一種擴展 XML 模式中現有枚舉列表的方法。不幸的是,XML 模式規范不允許在這些列表的創建過程中(參閱 參考資料)進行擴展。設計階段所選的值是固定的,而且都是可用的。盡管有這樣的限制,人們仍使用各種替代方案來實現列表擴展。很多使用現有的不能改變的模式的客戶經常提出這一要求。他們希望在添加新功能的同時保持向后兼容性。本文中,您將會看到模式設計者如何克服障礙實現該功能。
枚舉列表 是特定數據點的一組指定值。例如,您也許通過固定的值列表查看國家代碼,包括 DE(德國)、US(美國)和 JP(日本)。根據給定的值集,當一個新國家被識別出時,如 TL(東帝汶)或者 BA(波斯尼亞及黑塞哥維那),該怎么辦?使用以前的名稱列表的客戶必須改變實現來容納新值。
當使用 XML 模式對數據建模時,枚舉值被顯式列出。因此,國家代碼列表依次包含各個枚舉值。經常需要識別列表中的新值,而且必須將其容納到列表中,模式設計者試圖找到一種擴展列表的方法,實際上,是將這種方法構建到設計中,允許添加在設計時未知的附加值。
創建可擴展的枚舉列表
在尋找這一問題的解決方案時,受到四個關鍵標準的影響:
首先,要在設計階段之后擴展列表。不管是快速建立一個新的貿易伙伴還是建立時間關鍵型的新數據字段,在關鍵時刻進行擴展是一項實際需求。
其次,能夠在解析器中驗證值對于簡化實現是非常關鍵的。
第三,在單個周期內完成解析和驗證是至關重要的。這就避免了像 Genericode 解決方案一樣,在一個單獨的周期和解析器中進行驗證。對于某些設置來說,添加新技術需求會導致成本太高或者太耗時。
最后,解決方案必須能夠向后兼容原始的模式。不兼容的列表更改不能稱為擴展。
有些人認為根本就不應該擴展枚舉列表。數據建模人員也許認為如果想讓模型包含更多數據、擴展模型,那么可以根據產品創建模式 — 實際上,在需要時創建更大的模型并減少限制。如果能夠控制原始模式和數據模型,這樣做是可以的,這種方法也許是理想的方法。但是,如果您需要在設計階段之后進行實際擴展,這樣的方法是行不通的。
還有人認為擴展枚舉列表的關鍵是不使用 XML 模式驗證解析器。Genericode(參閱 參考資料)建議在第二層對枚舉列表進行驗證,脫離初始的 XML 模式解析器驗證過程。這種理論是正確的,而且這種方法的應用會越來越廣泛。但是,如果要在一個解析周期內完成,這種解決方案是無法做到的。在某些情況下,不可能執行第二個驗證周期。
當然,您可以在新列表中創建新元素。但是,不能向后兼容原始模式。我們的目標是在保持向后兼容性的同時實現一個可擴展的列表(參閱 參考資料)。
對于本文的目標,這里作出的假設基于我與客戶打交道的經驗 —— 即用附加值擴展現有枚舉列表的需求。另外,我假設在一個步驟內完成 XML 模式解析與驗證等操作。
擴展枚舉列表的必要條件
該擴展示例有四個必要條件:
允許在設計階段之后擴展枚舉列表。
用解析器驗證枚舉列表。
在一個周期內驗證枚舉列表。
維持和原始模式的向后兼容性。
舉例來說,一個團隊需要處理一個區域產業協會的枚舉列表(或任意現有列表)為例,并根據使用修改模式組件。先前的模式提供 MaritalStatus 組件和值的枚舉列表,如 清單 1 所示。
清單 1. 婚姻狀況枚舉列表

<xsd:simpleType name="MaritalStatusEnumType">
<xsd:restriction base="xsd:normalizedString">
<xsd:enumeration value="Divorced"/>
<xsd:enumeration value="Married"/>
<xsd:enumeration value="NeverMarried"/>
<xsd:enumeration value="Separated"/>
<xsd:enumeration value="SignificantOther"/>
<xsd:enumeration value="Widowed"/>
<xsd:enumeration value="Unknown"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="MaritalStatus" type="MaritalStatusEnumType"/>
假設一個公司要使用這些值,另外,還要支持它的重要貿易伙伴使用另一個值。CivilUnion 是一個擴展值,公司識別出該值不屬于原始模式。但是從語義上來說,使用現有元素 —MaritalStatus — 也是可以的。公司要如何實現呢?
回頁首
解決方案 1: 編輯原始模式使其包含新枚舉值
當然,編輯原始模式使其包含新枚舉值是最直接的方法。保留模式的本地副本,然后編輯這些模式以支持公司使用的枚舉值。
優點:易于實現
缺點:
需要編輯原始模式,這些模式將逐漸改變,以至于無法控制。如果擴展一個先前存在的列表,那么創建者(貿易伙伴、協會等)可能要發布列表的新版本。您需要將編輯的內容傳播到每個新版本中。
手動編輯模式會導致意外的編輯錯誤。
如果您不能(或不想)編輯原始模式,則需要一種替代方法。
回頁首
解決方案 2: 創建新枚舉列表并加入到原始列表中
第二個選擇是創建新枚舉列表,并將其加入到原始枚舉列表中。清單 1 顯示原始婚姻狀況列表。清單 2 顯示最新創建的枚舉列表。
清單 2. 新婚姻狀況枚舉列表

<xsd:simpleType name="MyExtMaritalStatusEnumType">
<xsd:restriction base="xsd:normalizedString">
<xsd:enumeration value="CivilUnion"/>
</xsd:restriction>
</xsd:simpleType>
使用 <xsd:union> 標記將其與原始列表結合,如 清單 3 所示。
清單 3. 將兩個列表組合起來

<xsd:simpleType name="MaritalStatusType_Union">
<xsd:union memberTypes="MyExtMaritalStatusEnumType MaritalStatusEnumType"/>
</xsd:simpleType>
<xsd:element name="MaritalStatus" type="MaritalStatusType_Union"/>
該解決方案仍然需要對模式進行編輯 — 即將元素 MaritalStatus 由 MaritalStatusType 類型轉換為 MaritalStatusType_Union 類型。改動不大,但仍然有一些手動編輯工作。
優點:不改變原始枚舉列表。
缺點:
在設計階段所有的值必須是已知的,防止后期綁定解決方案。
需要 <xsd:union> 標記支持,但有時該標記無法用工具實現。
回頁首
解決方案 3: 創建一個模式,并與原始枚舉類型結合
現在看一下有關眼睛顏色的人口數據用例。清單 4 顯示這一列表。
清單 4. Person Eye Color 枚舉列表

<xsd:simpleType name="PersonEyeColorType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Black"/>
<xsd:enumeration value="Hazel"/>
<xsd:enumeration value="Gray"/>
<xsd:enumeration value="Brown"/>
<xsd:enumeration value="Violet"/>
<xsd:enumeration value="Green"/>
<xsd:enumeration value="Blue"/>
<xsd:enumeration value="Maroon"/>
<xsd:enumeration value="Pink"/>
<xsd:enumeration value="Dichromatic"/>
<xsd:enumeration value="Unknown"/>
</xsd:restriction>
</xsd:simpleType>
接下來,創建采用新值的模式(一個正則表達式)。該模式是以 x: 為前綴的任意字符串。x: 是標準枚舉列表和擴展列表之間的描繪程序。清單 5 顯示這一模式。
清單 5. 用于擴展的正則表達式

<xsd:simpleType name="StringPatternType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="x:/S.*"/>
</xsd:restriction>
</xsd:simpleType>
最后,使用 <xsd:union> 標記結合列表與模式,如 清單 6 所示。
清單 6. 枚舉列表與擴展模式的結合

<xsd:simpleType name="MyExtPersonEyeColorType">
<xsd:union memberTypes="PersonEyeColorType StringPatternType"/>
</xsd:simpleType>
<xsd:element name="PersonEyeColor" type="MyExtPersonEyeColorType"/>
同一節點擁有標準和擴展值。兩個值很容易分離,而且都可以用解析器驗證,如 清單 7 所示。
清單 7. XML 實例樣例

<PersonEyeColor>Black</PersonEyeColor>
<PersonEyeColor>x:Teal</PersonEyeColor>
優點:
同一元素可用于所有數據。
用解析器對基本枚舉列表進行驗證。
清晰地分隔擴展值。
該解決方案允許在以后綁定新值。
缺點:
必須解析元素的內容,以確定是否已經被擴展。
模式解析器必須支持正則表達式。
需要 <xsd:union> 標記支持。
回頁首
解決方案 4:使用單獨的字段用于擴展
在該解決方案中,枚舉字段不會變化。然而,您要在模式中設計一個擴展字段來容納附加值。在本例中,初始列表是依賴型的(就業受益者和受養人之間的關系),如 清單 8 所示。
清單 8. 依賴關系枚舉列表
上一頁12 下一頁 閱讀全文
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久色乳综合思思在线视频| 亚洲日本欧美日韩高观看| 国产一区av在线| 欧美重口另类videos人妖| 2025国产精品视频| 精品欧美激情精品一区| 日韩中文字幕在线| 91国产中文字幕| 欧美日韩第一视频| 97精品欧美一区二区三区| 欧美日本高清一区| 最近免费中文字幕视频2019| 国产精品露脸av在线| 国外视频精品毛片| 欧美激情一区二区三级高清视频| 国外成人免费在线播放| 亚洲欧美色婷婷| 久久精品福利视频| 中文字幕欧美日韩在线| 亚洲综合最新在线| 久久免费国产视频| 亚洲黄色www网站| 中文字幕九色91在线| 亚洲国产成人91精品| 国产精品第8页| 热门国产精品亚洲第一区在线| 久久中文字幕国产| 日韩高清av一区二区三区| 国产欧美日韩专区发布| 午夜美女久久久久爽久久| 亚洲精品综合精品自拍| 国产精品极品美女粉嫩高清在线| 精品在线欧美视频| 国产精品美女久久久久av超清| 欧美精品aaa| 国产成人精品电影| 亚洲久久久久久久久久| 精品成人69xx.xyz| 亚洲欧美精品suv| 中文字幕亚洲图片| 日韩经典中文字幕在线观看| 久久在线免费观看视频| 日韩成人在线电影网| 亚洲欧洲av一区二区| 91在线视频一区| 精品福利在线观看| 亚洲欧美日韩国产精品| 亚洲系列中文字幕| 欧美日韩国产丝袜另类| 欧美日韩国产专区| 亚洲国产成人精品电影| 日韩三级影视基地| 色爱精品视频一区| 97久久国产精品| 国产日韩在线看| 精品国内产的精品视频在线观看| www.日韩视频| 亚洲国产精品电影| 亚洲аv电影天堂网| 欧美体内谢she精2性欧美| 一本色道久久综合狠狠躁篇怎么玩| 97视频在线观看亚洲| 亚洲综合视频1区| 欧美日韩第一视频| 欧美成在线视频| 黑人巨大精品欧美一区免费视频| 九九精品在线观看| 久久久亚洲精品视频| 欧美大秀在线观看| 97人洗澡人人免费公开视频碰碰碰| 欧美精品免费在线| 国产精品91久久久久久| 伊人久久综合97精品| 欧美成人精品三级在线观看| 蜜月aⅴ免费一区二区三区| 亚洲欧美一区二区三区在线| 欧美电影在线观看完整版| 亚洲成av人片在线观看香蕉| 九九热最新视频//这里只有精品| 国产精品视频99| 亚洲欧美另类中文字幕| 成人国产亚洲精品a区天堂华泰| 色综合男人天堂| 亚洲精品国产精品乱码不99按摩| 欧美日韩一区二区在线| 欧美性猛交xxxx免费看| 91国产精品电影| 久久精品国产免费观看| 亚洲视频在线看| 国产欧美在线视频| 亚洲福利视频在线| 国产日韩在线观看av| 国产精品久久婷婷六月丁香| 国产精品免费久久久久影院| 亚洲黄色免费三级| 日本不卡视频在线播放| 成人精品在线视频| 日韩中文字幕在线精品| 亚洲欧美另类中文字幕| 日韩欧美在线视频观看| 亚洲欧美国产制服动漫| 亚洲欧美日韩爽爽影院| 国产在线久久久| 欧美激情三级免费| 国产一区二区三区在线视频| 欧美高清在线播放| 欧美专区在线视频| 精品久久久视频| 91精品国产自产在线| 国产精品视频最多的网站| 国产99在线|中文| 国产精品一区二区性色av| 亚洲va男人天堂| 欧美又大又粗又长| 中文字幕少妇一区二区三区| 亚洲国语精品自产拍在线观看| 影音先锋欧美精品| 中文字幕久久久av一区| 久久天天躁狠狠躁夜夜躁2014| 欧美人在线视频| 日韩电影在线观看免费| 在线视频亚洲欧美| 91精品视频在线免费观看| 欧美性xxxx在线播放| 成人免费高清完整版在线观看| 国产成人自拍视频在线观看| 日韩精品在线观看一区| 狠狠爱在线视频一区| 欧美大片第1页| 欧美精品久久久久久久免费观看| 欧美www视频在线观看| 欧美极品少妇xxxxx| 欧美一级视频在线观看| 亚洲午夜av久久乱码| 欧美影院在线播放| 欧美日韩国产精品一区| 国产不卡在线观看| 久久亚洲精品毛片| 日韩大胆人体377p| 色综合色综合久久综合频道88| 另类少妇人与禽zozz0性伦| 欧美色视频日本高清在线观看| 亚洲最大成人免费视频| 欧洲成人在线视频| 亚洲成人精品视频| 久久香蕉频线观| 日本中文字幕久久看| 欧美一级淫片videoshd| 亚洲第一福利网站| 日韩av在线天堂网| 精品偷拍各种wc美女嘘嘘| 国产免费一区二区三区在线观看| 欧美高清videos高潮hd| 这里只有精品视频在线| 亚洲性无码av在线| 亚洲变态欧美另类捆绑| 国产成人精彩在线视频九色| 中文字幕一区二区精品| 91在线无精精品一区二区| 不卡中文字幕av| 欧美国产日本在线| 亚洲一区二区日本| 亚洲欧美日韩一区二区三区在线| 国产欧美一区二区三区四区|