我有一个情况,我们有一个基类,它有几个子类实现。基类用于强制子类包含系统需要的某些属性。
无论如何,我想以编程方式为子类生成 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 重构的角度尝试这样做也会有局限性,特别是在涉及抽象类型或替换组的情况下(我说的是一般情况)。
关于c# - 从 C# 中的类型以编程方式生成 XSD - 在子类 XSD 中包含基类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936807/