在XSD中没有其他元素的继承

时间:2012-07-19 10:31:01

标签: .net wcf web-services xsd

有人可以告诉我,这些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" />

所以,我的问题是......第一个定义是否有效?

1 个答案:

答案 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" />