You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XML Schema实现OpenAPI的anyOf类型定义且避免重复

解决方案:复用已有复杂类型实现OpenAPI anyOf的XML Schema等效定义

你需要实现对应OpenAPI anyOf逻辑的XML Schema类型ObjRefOrValue,要求复用已定义的Obj和ObjRef复杂类型,避免重复结构定义。由于union仅支持简单类型,可通过**分组(xs:group)+ 选择(xs:choice)**的方案实现:

  1. 提取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>
    
  2. 修改原有Obj和ObjRef类型,引用上述分组(保持类型可单独使用)

    <xs:complexType name="Obj">
        <xs:group ref="ObjContent"/>
    </xs:complexType>
    
    <xs:complexType name="ObjRef">
        <xs:group ref="ObjRefContent"/>
    </xs:complexType>
    
  3. 定义ObjRefOrValue类型,通过xs:choice实现二选一逻辑

    <xs:complexType name="ObjRefOrValue">
        <xs:choice>
            <xs:group ref="ObjContent"/>
            <xs:group ref="ObjRefContent"/>
        </xs:choice>
    </xs:complexType>
    
  4. 直接定义目标元素

    <xs:element name="Object" type="ObjRefOrValue"/>
    

效果说明

这样定义后,<Object>元素可以直接包含Obj的结构(<id>+<name>)或者ObjRef的结构(<href>),完全匹配OpenAPI中anyOf的行为,同时Obj和ObjRef类型依然可以单独使用,没有重复定义任何结构。

内容的提问来源于stack exchange,提问作者Marcin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:13:16