2012-07-19 36 views
0

有人可以告訴我whitch這些XSD部分(xsd1或xsd2)的有效期爲下面的示例代碼:繼承與XSD沒有額外elments

Class definitions: 
class A 
{ 
int prop1; 
int prop2; 
} 

class B : A {} 

因此,A類是基類和B類繼承A並且沒有附屬性。

xsd1:在這種情況下,如果我使用的wsimport生成從WSDL文件的代碼包含XSD的這一部分,我將獲得生成的代碼的所有元素,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

我想正確的解決方案是第二個。 解釋爲什麼如果您將complexTypes視爲類並將元素視爲實例,可能會更好。

在您的第一個xsd中,實際上是聲明瞭類A的兩個實例(A和B)。 在第二個中,您仍然聲明瞭同一個類的兩個實例,但是您還包括B類的定義。

事實上,我想這將是更正確與

<xs:element name="B" nillable="true" type="tns:B" /> 

<xs:element name="B" nillable="true" type="tns:A" />