c# - 从 C# 中的类型以编程方式生成 XSD - 在子类 XSD 中包含基类属性

标签 c# xml 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 重构的角度尝试这样做也会有局限性,特别是在涉及抽象类型或替换组的情况下(我说的是一般情况)。

关于c# - 从 C# 中的类型以编程方式生成 XSD - 在子类 XSD 中包含基类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936807/

相关文章:

c# - 在 Windows 中,如何使用 C++ 或 C# 在属于另一个进程的窗口中获取突出显示的文本?

c# - 如何使用 monotouch 将文件从应用程序包复制到 ios 中的文档目录

c# - MS Word 自动化 : can't enable red underlines for spelling check

php - Facebook 注册 - Conceal 字段不返回数据

XML 架构 : Referenced attribute is missing

C# 定义方法后更改方法时遇到问题

html - 将外部 CSS 文件添加到博客模板

java - 如何在解析 SOAP 正文时从 NodeList 对象中提取属性值

c# - xsd.exe 属性顺序

xslt - ID/IDREFS 在 XML Schema 中的使用