我的情况是我们有一个基类,有几个子类实现。基类用于强制子类包含系统所需的某些属性。
无论如何,我想以编程方式为子类生成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>
有人知道这是否可行?
答案 0 :(得分:1)
我会非常惊讶地看到这可能就像你所描述的那样,只是因为这样做会破坏物体从面向对象的角度,至少在大多数时候。例如,如果一个类使用某个类型的属性,那么在OO中,将允许任何扩展该类型的类。
折叠类层次结构(如果我理解正确,这就是您所描述的),将无法正确创建XSD模型。即使从XSD重构角度尝试这样做也会有限制,特别是涉及抽象类型或替换组的时候(我正在谈论)。