加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从C#中的类型生成程序化XSD – 在子类XSD中包含基类属性

发布时间:2020-12-15 21:39:03 所属栏目:百科 来源:网络整理
导读:我有一种情况,我们有一个基类,几个子类实现.基类用于强制子类包含系统所需的某些属性. 无论如何,我想以编程方式为子类生成XSD,但我希望基类的属性出现在子类XSD中,因为基类是出于内部原因而使用,并不会对客户端产生任何意义. 例如,目前如果我有: class Foo
我有一种情况,我们有一个基类,几个子类实现.基类用于强制子类包含系统所需的某些属性.

无论如何,我想以编程方式为子类生成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重构角度尝试这样做也会有局限性,特别是涉及抽象类型或替换组的时候(我正在谈论).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读