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

在Enterprise Architect中实现XSD扩展重定义的替代方案咨询

替代xs:redefine的XSD扩展方案(适配Enterprise Architect)

核心需求回顾

  • 无法修改原XSD,仅能引用
  • 复用原架构元素,在新命名空间下为其添加子元素
  • 需在Enterprise Architect(EA)中建模,支持生成文档及架构输出

方案1:使用xs:extension扩展原复杂类型

这是最通用的替代方案,EA完全支持xs:extension构造,无需依赖xs:redefine。

实现步骤

  1. 在新命名空间的XSD中导入原XSD
  2. 基于原类型创建扩展后的新类型,添加新命名空间下的子元素
  3. 定义使用新类型的元素,或直接扩展原元素的类型

代码示例

new.xsd(扩展定义)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    xmlns="new-namespace" 
    xmlns:bs="old-namespace" 
    targetNamespace="new-namespace"> 
    <!-- 导入原XSD -->
    <xs:import namespace="old-namespace" schemaLocation="old.xsd"/>    

    <!-- 扩展原复杂类型,添加新命名空间的子元素 -->
    <xs:complexType name="ExtendedOldCustomType">
        <xs:complexContent>
            <xs:extension base="bs:OldCustomType">
                <!-- 新命名空间下的子元素 -->
                <xs:sequence>
                    <xs:element name="newSubElement" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- 定义使用扩展类型的元素,或覆盖原元素(如果需要) -->
    <xs:element name="myElement" type="ExtendedOldCustomType" />
</xs:schema>

main.xsd(验证入口)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    xmlns="old-namespace" 
    targetNamespace="old-namespace"
    xmlns:new="new-namespace"> 
    <!-- 导入扩展后的XSD -->
    <xs:import schemaLocation="new.xsd" namespace="new-namespace"/>
    <!-- 无需redefine,直接使用原元素或扩展后的元素 -->
</xs:schema>

EA建模操作

  • 在EA中创建新的XSD Schema节点,设置目标命名空间为new-namespace
  • 导入原XSD作为外部引用(EA支持导入外部XSD到模型中)
  • 创建新的Complex Type,设置Base Type为原XSD中的OldCustomType
  • 在新Complex Type下添加子元素(属于new-namespace)
  • 定义使用该扩展类型的元素,完成后可直接生成XSD和文档

方案2:使用xs:group复用原内容并扩展

如果原类型的结构适合拆分组,可以用xs:group导入原类型的内容,再组合新元素,避免直接扩展类型。

代码示例

new.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    xmlns="new-namespace" 
    xmlns:bs="old-namespace" 
    targetNamespace="new-namespace"> 
    <xs:import namespace="old-namespace" schemaLocation="old.xsd"/>    

    <!-- 引用原类型的内容为组(如果原XSD已定义组,直接引用;否则需手动提取) -->
    <xs:group name="OldCustomTypeContent">
        <xs:sequence>
            <xs:element ref="bs:existingElement1"/>
            <xs:element ref="bs:existingElement2"/>
            <!-- 原类型的其他元素 -->
        </xs:sequence>
    </xs:group>

    <!-- 新类型:包含原组 + 新元素 -->
    <xs:complexType name="ExtendedOldCustomType">
        <xs:sequence>
            <xs:group ref="OldCustomTypeContent"/>
            <xs:element name="newSubElement" type="xs:int" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="myElement" type="ExtendedOldCustomType"/>
</xs:schema>

EA建模操作

  • 在EA中创建Group节点,引用原XSD中的元素
  • 创建新Complex Type,添加该Group节点,再追加新元素
  • 此方案适合需要灵活重组原结构的场景,EA对Group的支持完善

方案3:WADL扩展适配方案

对于EA生成的WADL扩展,可利用WADL原生的扩展机制,结合命名空间实现,无需依赖XSD的redefine:

实现方式

  1. 在WADL中声明新命名空间
  2. 在原资源/参数的节点下添加新命名空间的元素
  3. 关联扩展的XSD定义(用于验证)

WADL示例

<application xmlns="http://wadl.dev.java.net/2009/02"
    xmlns:new="new-namespace"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="new-namespace new.xsd">

    <!-- 原WADL内容 -->
    <resources base="http://example.com/api">
        <resource path="/old-resource">
            <method name="GET">
                <!-- 添加新命名空间的扩展元素 -->
                <new:customExtension>
                    <new:param name="filter" type="xs:string"/>
                </new:customExtension>
            </method>
        </resource>
    </resources>
</application>

EA建模操作

  • 在EA的WADL模型中,添加新的命名空间声明
  • 在对应Resource/Method节点下,添加自定义元素(指定新命名空间)
  • 关联扩展的XSD Schema,EA可生成包含扩展内容的WADL文档

关键注意事项

  • 所有扩展元素必须属于新命名空间,避免与原XSD的命名空间冲突
  • EA中导入外部XSD时,需确保路径正确,模型能正确解析原类型
  • 若需复用原元素的实例,可通过xs:element ref="bs:oldElement"直接引用,无需重新定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33