Xml 通过从完全相同的类型向后扩展来修改现有的XSD类型是否兼容?

Xml 通过从完全相同的类型向后扩展来修改现有的XSD类型是否兼容?,xml,web-services,xsd,wsdl,schema-design,Xml,Web Services,Xsd,Wsdl,Schema Design,我在前面为客户实现的WS制作了XSD+WSDL。我们实现了客户端。我在WS-Create操作中有如下类型: <xs:complexType name="tWorkCreate"> <xs:sequence> <xs:element ref="plan:workkey" /> <xs:element ref="plan:workdata" /> </xs:sequence> </xs:complexType>

我在前面为客户实现的WS制作了XSD+WSDL。我们实现了客户端。我在WS-Create操作中有如下类型:

<xs:complexType name="tWorkCreate">
 <xs:sequence>
  <xs:element ref="plan:workkey"  />
  <xs:element ref="plan:workdata"  />
 </xs:sequence>
</xs:complexType>

现在我想为新的更新操作使用相同的类型,但是命名是错误的。所以我打算这样做:

<xs:complexType name="tWorkSet">
 <xs:sequence>
  <xs:element ref="plan:workkey"  />
  <xs:element ref="plan:workdata"  />
 </xs:sequence>
</xs:complexType>


<xs:complexType name="tWorkCreate">
 <xs:complexContent>
  <xs:extension base="tWorkSet">
    <xs:sequence>
    </xs:sequence>
  </xs:extension>
 </xs:complexContent>
</xs:complexType>


并直接使用
tWorkSet
执行
Update
操作(
tworkscreate
操作将是相同的)。现有客户不需要(也没有实施)
更新
。不复制类型的原因是,例如,我们可以在代码中以类似方式处理
Update
Create
。那么,复制该类型是更好的选择,还是这种扩展场景合理

是的,以这种方式重构类型定义是一个好主意,并且是向后兼容的1。在类型重构之前有效的所有相同XML文档在重构之后都将有效。事实上,它比向后兼容更好,因为在更改之前有效的XML文档集在更改之后也同样有效


1假设客户端对类型名称本身没有直接依赖关系,例如通过JAXB绑定或在XML文档实例中使用
xsi:type
use。[多亏了]

当应用于XSD时,向后兼容性非常棘手。一个模式可以被用在很多方面;没有对边界的深入理解,这只是一种猜测。例如,一般来说,声称更改类型名是向后兼容的是错误的;如果有人在有效的XML中使用xsi:type怎么办

创建类型层次结构也应该仔细规划。与当今大多数主流OO语言一样,您只能从一种类型进行扩展

在您的情况下,您似乎关心重用;那么,最安全的方法可能是通过创建一个组来重用,然后根据需要由您的类型引用该组。当然,“最安全”取决于你定义的边界。对于JAXB、.NET等,组是受支持的,默认情况下它们是内联的,即它们在XML和生成的代码方面没有任何足迹

<xs:group name="tWorkSet">
    <xs:sequence>
        <xs:element ref="plan:workkey"/>
        <xs:element ref="plan:workdata"/>
    </xs:sequence>
</xs:group>

<xs:complexType name="tWorkCreate">
    <xs:group ref="tWorkSet"/>
</xs:complexType>


U回答了我的两个问题。谢谢你会选择哪一个呢?你应该可以随意以这种方式重命名类型或重构,无论哪种方式都可以让你的XSD清晰地表达你的意图。我同意共享类型声明比重复声明好,所以如果这是两种可能性之间的区别,那么就选择一种不会不必要地重复的声明。谢谢你的回答。xsi:type是一个我一无所知的优点。情况并非如此,因为我编写了唯一的客户端,而它没有发送xsi:type。但在这种情况下,组可能并不可取,因为正如u所说,它是内联的,生成的代码对tWorkSet一无所知。因此,我必须加倍方法来为tWorkUpdate和tWorkCreate实例赋值。