有人可以告诉我,这些xsd部分(xsd1或xsd2)对下面的示例代码有效:
Class definitions:
class A
{
int prop1;
int prop2;
}
class B : A {}
因此,A类是基类,B类继承A并且没有附加属性。
xsd1:在这种情况下,如果我使用wsimport从包含xsd这部分的wsdl文件生成代码,我将获得所有元素A和B的生成代码。 但是,如果我使用svcutil,我将只生成A类。
<xs:element name="B" nillable="true" type="tns:A" />
<xs:complexType name="A">
<xs:sequence>
<xs:element name="prop1" type="xs:string"/>
<xs:element name="prop2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="A" nillable="true" type="tns:A" />
xsd1:在这种情况下,wsimport和svcutil都将生成所有元素A和B.
<xs:complexType name="B">
<xs:complexContent mixed="false">
<xs:extension base="tns:A">
<xs:sequence />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="B" nillable="true" type="tns:A" />
<xs:complexType name="A">
<xs:sequence>
<xs:element name="prop1" type="xs:string"/>
<xs:element name="prop2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="A" nillable="true" type="tns:A" />
所以,我的问题是......第一个定义是否有效?
答案 0 :(得分:1)
我想正确的解决方案是第二个。 解释为什么如果将complexTypes视为类,将元素视为实例,可能会更好。
在你的第一个xsd中你实际上声明了A类的两个实例(A和B)。 在第二个中,您仍然声明同一个类的两个实例,但是您还包括B类的定义。
事实上,我认为
会更正确<xs:element name="B" nillable="true" type="tns:B" />
大于
<xs:element name="B" nillable="true" type="tns:A" />