创建近似已有XSD复杂类型的新类型:最优实现方案咨询
XSD复杂类型定义最优方案分析
原始复杂类型定义
<xsd:complexType name="MyComplexType"> <xsd:sequence> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> <xsd:element name="Age" type="xsd:int"/> <!-- Add more elements here as needed --> </xsd:sequence> </xsd:complexType>
需求很明确:要创建一个和MyComplexType结构近似,但不含Age元素的新复杂类型。下面逐个分析给出的三个方案:
方案1:使用complexContent扩展
<xsd:complexType name="CustomComplexType"> <xsd:complexContent> <xsd:extension base="MyComplexType"> <xsd:sequence> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> <!-- Add more elements here as needed, excluding Age --> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType>
这个方案完全错误,属于对xsd:extension的误用。扩展的作用是在基类型的所有元素之后追加新元素,而不是覆盖或移除基类型已有的元素。最终生成的CustomComplexType会同时包含基类型的FirstName、LastName、Age,再加上扩展部分的FirstName和LastName,完全不符合“不含Age”的需求,直接pass。
方案2:使用choice(已排除)
<xsd:complexType name="MyComplexType"> <xsd:sequence> <xsd:choice> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> <!-- Add more elements here as needed --> </xsd:choice> </xsd:sequence> </xsd:complexType>
这个方案需要修改原始的MyComplexType,把原本要求必须全部存在的三个元素改成三选一的可选结构,不仅彻底改变了原有类型的语义,而且题目明确说无法修改现有类型,所以直接排除。
方案3:全新创建复杂类型
<xsd:complexType name="MySimplifiedComplexType"> <xsd:sequence> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> </xsd:sequence> </xsd:complexType>
这是当前场景下的最优解。它既不需要改动原有类型,又精准实现了“不含Age元素”的需求,结构清晰,语义明确。后续如果要给这个新类型加元素,直接在序列里追加就行,完全符合设计预期。
结论
方案3是唯一符合需求的最优实现方式,方案1逻辑错误,方案2因无法修改原有类型被排除。
内容的提问来源于stack exchange,提问作者Jaison
相关产品推荐
相关产品推荐

