如何从 C# 类 生成 xsd 枚举?

How do I generate an xsd enumeration from C# classes?

我有一个 XSD(XML 架构定义)文件,它需要一个由给定 (ScoreService.App_Code.Entities) 中的所有 class 组成的枚举列表(限制)命名空间。

我在构建过程中使用 xsd.exe 自动执行从有问题的 classes 创建 XSD 文件的任务,并从运行时读取它们正确组装(MyBaseClassMyClassA、...),创建以下 xsd 文件没有问题:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MyBaseClass" nillable="true" type="MyBaseClass" />
  <xs:complexType name="MyBaseClass">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="Id" type="xs:int" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="MyClassA" nillable="true" type="MyClassA" />
  <xs:complexType name="MyClassA">
    <xs:complexContent mixed="false">
      <xs:extension base="MyBaseClass" />
    </xs:complexContent>
  </xs:complexType>

  ...

</xs:schema>

但是据我所知,我无法在 xsd 枚举中使用它。我想我可以用 class 属性做一些事情来控制 XSD 输出的外观,但我尝试的大多数属性只适用于 properties/members.

我希望生成类似于以下的 XSD 结构:

<xs:simpleType name="ParamTypeRestriction">
  <xs:restriction base="xs:string">
    <xs:enumeration value="MyBaseClass"></xs:enumeration>
    <xs:enumeration value="MyClassA"></xs:enumeration>
    ...
  </xs:restriction>
</xs:simpleType>

这是否可以在没有进一步自动化的情况下实现,例如手动处理生成的 xsd 文件?如果是,怎么做?

据我所知,没有 product/library 可以满足您的需要。但是,就代码而言,将一些东西放在一起应该相对容易,这将完全满足您的需求。

这就是我要做的,以某种方式限制我必须对文件结构、classes 的可见性等做出假设的数量。

首先,我会编译一个程序集列表,其中包含您希望捕获的 classes。

对于该列表中的每个程序集,我都会得到我需要的类型列表。有很多方法可以反映一个程序集;假设程序集在正确的上下文中(即所有依赖项都可发现),那么像这样的事情会很容易做到这一点:

Assembly assembly = Assembly.Load(new AssemblyName() { CodeBase = path })

获取类型列表as you need:

Type[] types = assembly.GetExportedTypes();

对于每种类型,class 的名称将在 type.Name 中 - 因为您对全名不感兴趣。

使用类型的组合列表构造一个简单的模式,只有一个简单的类型;使用 System.Xml.Schema 中的 classes。代码大概是这样的:

    void foo(IEnumerable<Type> types)
    {
        var rs = new XmlSchemaSimpleTypeRestriction
        {
            BaseTypeName = new XmlQualifiedName("string", XmlSchema.Namespace)
        };
        foreach (var t in types)
        {
            rs.Facets.Add(new XmlSchemaEnumerationFacet {Value = t.Name});
        }
        var schema = new XmlSchema();
        schema.Items.Add(new XmlSchemaSimpleType
        {
            Name = "ParamTypeRestriction",
            Content = rs
        });
        schema.Write(...);
    }