2012-08-13 77 views
4

我有一種情況,即有幾個子類實現的基類。基類用於強制子類包含系統需要的某些屬性。從C#中的類型生成編程式XSD - 在子類XSD中包含基類屬性

無論如何,我想以編程方式爲子類生成XSD,但我希望基類的屬性出現在子類XSD中,因爲基類用於內部原因並且不會真的具有對客戶意味着什麼。

例如,目前如果我有:

class Foo { 
    public string Id { get; set; } 
} 

class Bar : Foo { 
    public string Name { get; set; } 
} 

我跑,通過下面的代碼:

private string ExtractXsdFromType() 
{ 
    Type type = typeof(Bar); 
    XmlReflectionImporter importer = new XmlReflectionImporter(); 
    XmlTypeMapping mapping = importer.ImportTypeMapping(type); 
    XmlSchemas xmlSchemas = new XmlSchemas(); 
    XmlSchemaExporter xmlSchemaExporter = new XmlSchemaExporter(xmlSchemas); 
    using (var writer = new StringWriter()) 
    { 
     xmlSchemaExporter.ExportTypeMapping(mapping); 
     xmlSchemas[0].Write(writer); 
     return XElement.Parse(writer.ToString()).ToString(); 
    } 
} 

然後,它會產生這樣的XSD:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Bar" nillable="true" type="Bar" /> 
    <xs:complexType name="Bar"> 
    <xs:complexContent mixed="false"> 
     <xs:extension base="Foo"> 
     <xs:sequence> 
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="Foo" abstract="true"> 
    <xs:attribute name="Id" type="xs:int" use="required" /> 
    </xs:complexType> 
</xs:schema> 

但我想創建一個像這樣的XSD:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Bar" nillable="true" type="Bar" /> 
    <xs:complexType name="Bar"> 
    <xs:complexContent mixed="false"> 
     <xs:sequence> 
     <xs:attribute name="Id" type="xs:int" use="required" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

有誰知道這是否可能?

回答

1

我會非常驚訝地發現,這種方式可能是你描述的方式,因爲像這樣做會至少大部分時間都會從面向對象的角度來破壞事物。例如,如果一個類使用某個類型的屬性,那麼在OO中,將允許任何擴展該類型的類來代替。

摺疊類層次結構(如果我的理解正確,這就是您所描述的),將無法正確創建XSD模型。即使從XSD重構角度嘗試這樣做,特別是涉及抽象類型或替換組(我通常在說話)的情況下,也會存在限制。