如何用XML Schema实现OpenAPI的anyOf类型定义且避免重复
解决方案:复用已有复杂类型实现OpenAPI anyOf的XML Schema等效定义
你需要实现对应OpenAPI anyOf逻辑的XML Schema类型ObjRefOrValue,要求复用已定义的Obj和ObjRef复杂类型,避免重复结构定义。由于union仅支持简单类型,可通过**分组(xs:group)+ 选择(xs:choice)**的方案实现:
提取
Obj和ObjRef的内部结构为可复用分组<!-- 提取Obj的核心结构为分组 --> <xs:group name="ObjContent"> <xs:sequence> <xs:element name="id" type="xs:string"/> <xs:element name="name" type="xs:string"/> </xs:sequence> </xs:group> <!-- 提取ObjRef的核心结构为分组 --> <xs:group name="ObjRefContent"> <xs:sequence> <xs:element name="href" type="xs:string"/> </xs:sequence> </xs:group>修改原有
Obj和ObjRef类型,引用上述分组(保持类型可单独使用)<xs:complexType name="Obj"> <xs:group ref="ObjContent"/> </xs:complexType> <xs:complexType name="ObjRef"> <xs:group ref="ObjRefContent"/> </xs:complexType>定义
ObjRefOrValue类型,通过xs:choice实现二选一逻辑<xs:complexType name="ObjRefOrValue"> <xs:choice> <xs:group ref="ObjContent"/> <xs:group ref="ObjRefContent"/> </xs:choice> </xs:complexType>直接定义目标元素
<xs:element name="Object" type="ObjRefOrValue"/>
效果说明
这样定义后,<Object>元素可以直接包含Obj的结构(<id>+<name>)或者ObjRef的结构(<href>),完全匹配OpenAPI中anyOf的行为,同时Obj和ObjRef类型依然可以单独使用,没有重复定义任何结构。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

