在Enterprise Architect中实现XSD扩展重定义的替代方案咨询
替代xs:redefine的XSD扩展方案(适配Enterprise Architect)
核心需求回顾
- 无法修改原XSD,仅能引用
- 复用原架构元素,在新命名空间下为其添加子元素
- 需在Enterprise Architect(EA)中建模,支持生成文档及架构输出
方案1:使用xs:extension扩展原复杂类型
这是最通用的替代方案,EA完全支持xs:extension构造,无需依赖xs:redefine。
实现步骤
- 在新命名空间的XSD中导入原XSD
- 基于原类型创建扩展后的新类型,添加新命名空间下的子元素
- 定义使用新类型的元素,或直接扩展原元素的类型
代码示例
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:
实现方式
- 在WADL中声明新命名空间
- 在原资源/参数的节点下添加新命名空间的元素
- 关联扩展的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
相关产品推荐
相关产品推荐

