如何定义XML Schema:支持Filter可选、Map/UpdateObject二选一且不混合
如何定义满足特定约束的XML Schema类型
你需要适配的XML结构有两种合法形式:
<Object> <Filter> <!-- 0个或1个 --> <!-- Filter内容 --> </Filter> <MapObject> <!-- 1个或多个 --> <!-- MapObject内容 --> </MapObject> </Object>
或者
<Object> <Filter> <!-- 0个或1个 --> <!-- Filter内容 --> </Filter> <UpdateObject> <!-- 仅1个 --> <!-- UpdateObject内容 --> </UpdateObject> </Object>
你最初尝试的xs:sequence写法无法满足以下约束:
- 必须包含至少一个
MapObject或UpdateObject MapObject可存在多个,但UpdateObject仅能存在一个MapObject与UpdateObject不可同时出现
正确的Schema定义方案
使用xs:sequence结合xs:choice来实现约束:
<xs:complexType name="ObjectType"> <xs:sequence> <!-- Filter可选,0个或1个 --> <xs:element name="Filter" minOccurs="0" maxOccurs="1" type="FilterType"/> <!-- 二选一:要么多个MapObject,要么一个UpdateObject --> <xs:choice> <xs:element name="MapObject" minOccurs="1" maxOccurs="unbounded" type="MapObjectType"/> <xs:element name="UpdateObject" minOccurs="1" maxOccurs="1" type="UpdateObjectType"/> </xs:choice> </xs:sequence> </xs:complexType>
方案说明
xs:sequence保证Filter(如果存在)必须位于MapObject或UpdateObject之前xs:choice强制只能选择其中一种分支:- 第一个分支要求至少1个
MapObject,允许多个 - 第二个分支要求恰好1个
UpdateObject
- 第一个分支要求至少1个
- 这种写法完全满足你提出的所有约束:既保证了至少有一个业务元素,又限制了
MapObject和UpdateObject不能同时出现,同时符合各自的数量要求
内容的提问来源于stack exchange,提问作者Taeolas
相关产品推荐
相关产品推荐

