[英]Programmatic XSD generation from types in C# - Include base class properties in subclass 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>
有誰知道這是否可能?
我會非常驚訝地看到這可能就像你描述的那樣可能只是因為這樣做會破壞物體從面向對象的角度,至少在大多數時候。 例如,如果類使用類型的屬性,那么在OO中將允許任何擴展該類型的類。
折疊類層次結構(如果我理解正確,這就是您所描述的),將無法正確創建XSD模型。 即使從XSD重構角度嘗試這樣做也會有局限性,特別是涉及抽象類型或替換組的時候(我正在談論)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.