形式设想者和完成职员须要一种扩大 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="porced"/> <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. 依靠关联罗列列表
<xsd:simpleType name="DependentRelationshipEnumType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="AdoptedChild"/> <xsd:enumeration value="Brother"/> <xsd:enumeration value="Child"/> <xsd:enumeration value="ExSpouse"/> <xsd:enumeration value="Father"/> <xsd:enumeration value="Granddaughter"/> <xsd:enumeration value="Grandson"/> <xsd:enumeration value="Grandfather"/> <xsd:enumeration value="Grandmother"/> <xsd:enumeration value="LifePartner"/> <xsd:enumeration value="Mother"/> <xsd:enumeration value="Sister"/> <xsd:enumeration value="Spouse"/> <xsd:enumeration value="Extension"/> </xsd:restriction> </xsd:simpleType>
须要一个能够包容新值的附加属性 — extension—。清单 9 显现了该属性。
清单 9. 依靠关联的 extension 属性
<xsd:complexType name="DependentRelationshipType"> <xsd:simpleContent> <xsd:extension base="DependentRelationshipEnumType"> <xsd:attribute name="extension" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:element name="DependentRelationship" type="DependentRelationshipType"/>
清单 10 显现一些反应 extension 的 XML 实例。
清单 10. 示例 XML 实例
<DependentRelationship>Child</DependentRelationship> <DependentRelationship extension="MyNewRelationship">Extension</DependentRelationship>
长处:
不须要编辑原始形式。
该解决计划许可在今后绑定新值。
在原始形式中显式设想 extension 要领。
瑕玷:
在设想阶段,必需在每一个罗列列表中设想 extension 要领。
必需在元素中而不是在属性中设置罗列值。
回页首
解决计划 5: 基于文档的要领 —— 与字符串连系
注重:解决计划 5 和解决计划 6 违反了在一个周期内举行考证 这一请求。然则,我之所以在这里引见它们,是由于在许多现实环境中能够运用这些要领。
在第 5 个解决计划中,运用 <xsd:union> 标记将罗列列表与字符串连系。现实上,该解决计划提醒吸收体系哪些值是规范的(包括包装和拼写)。但现实上字符串字段能够寄存任何值。因而,剖析器并不考证值。相反,这些值在第二个周期或许在吸收数据的运用顺序中考证。有些 XML 构造就运用如许的计划。
清单 11 显现经由历程 <xsd:union> 将一个罗列列表和 <xsd:string> 连系。由于恣意值都能够是一个字符串,所以不必考证罗列列表。这些值发起运用规范值。
清单 11. 与字符串连系的 DayOfWeek 罗列列表
<xsd:simpleType name="DayOfWeekEnumType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Sunday"/> <xsd:enumeration value="Monday"/> <xsd:enumeration value="Tuesday"/> <xsd:enumeration value="Wednesday"/> <xsd:enumeration value="Thursday"/> <xsd:enumeration value="Friday"/> <xsd:enumeration value="Saturday"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="DayOfWeek" type="DayOfWeekEnumType"/> <xsd:simpleType name="ExtendedDayOfWeekType"> <xsd:union memberTypes="DayOfWeekEnumType xsd:string"/> </xsd:simpleType> <xsd:element name="DayOfWeek_solution5" type="ExtendedDayOfWeekType"/>
长处:能够增加恣意的扩大值,纵然在后期绑定时也能够增加。
瑕玷:
剖析器不考证罗列值,在第二个步骤中才举行考证。
须要 <xsd:union> 标记支撑。
回页首
解决计划 6: 基于文档的要领 —— 运用 <xsd:annotation>
要运用该要领,将现实的罗列值放到 <xsd:documentation> 标记内,同时将数据字段保存为一个简朴字符串。清单 12 显现罗列值。
清单 12. 在 <xsd:documentation> 标记内的罗列值
<xsd:element name="DayOfWeek" type="xsd:string"> <xsd:annotation> <xsd:documentation> <!-- suggested enumerations --> <xsd:enumeration value="Sunday"/> <xsd:enumeration value="Monday"/> <xsd:enumeration value="Tuesday"/> <xsd:enumeration value="Wednesday"/> <xsd:enumeration value="Thursday"/> <xsd:enumeration value="Friday"/> <xsd:enumeration value="Saturday"/> </xsd:documentation> </xsd:annotation> </xsd:element>
长处:
能够增加恣意的扩大值,纵然在后期绑定时也能够增加。
只须要最简朴的 XML 形式特征。
瑕玷:剖析器不考证罗列值。
回页首
未议论的要领
我省略了其他几种扩大罗列列表的解决计划。下面简朴引见了两种没有运用的要领:
运用 <xsd:redefine> 标记: 平常不运用 XML 形式的这一特征,而且平常没法用东西完成它。该要领常常被以为是防止从新定义的最好实践。
运用 substitutionGroup 元素替代包括一切值的团结列表: 别的一种精彩的解决计划,运用了替代组和团结。将原始列表与新列表团结以竖立一个完全的罗列列表,然后运用 substitutionGroups 标记(或 <xsi:type> 标记)替代一个全局作用域元素。该要领的瑕玷是替代不能派生有效的团结,替代须要两个组件来自雷同的基范例。扩大和限定是替代的两个有效要领。然则,依据 XML 形式范例,团结并非有效的派生手艺(参阅 参考资料)。
回页首
结束语
XML 形式设想者和完成职员须要一种要领来扩大现有的罗列列表。由于一旦原始列表竖立后,范例不许可举行扩大,因而须要找到一种要领现实完成扩大。完成职员能够运用本文的示例来设想和扩大罗列列表。每种要领都有优瑕玷,没有一种要领在一切用例中都是最好要领。那末,应当运用哪一种要领呢?
请斟酌这些履历轨则:
假如您习气编辑原始罗列列表或形式,而且在设想阶段就晓得一切要扩大的罗列值,最好运用 解决计划 1(手动编辑原始列表)或 解决计划 2(竖立新列表并加入到原始列表中)。
假如想运用雷同的语义元夙来包括基础罗列列表和扩大罗列列表,能够斟酌 解决计划 3(与形式团结)。
假如许可原始列表与扩大列表有差别的字段,能够运用 解决计划 4(自力的字段)。
假如不想在剖析器中剖析罗列值,能够斟酌 Genericode 要领或运用 解决计划 5 或 解决计划 6。
这些指点准绳能够使形式设想者找到有用的最好实践,而且能够协助他们竖立易于完成、可扩大的罗列列表。
XML 形式和 XML 实例示例 ExtendEnumeratedListsCode.zip 2KB
以上就是在XML形式中扩大罗列列表的示例代码详解的细致内容,更多请关注ki4网别的相干文章!