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

时间:2015-12-03 23:15:58

标签: c# visual-studio xsd xsd.exe

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

我在构建过程中使用xsd.exe自动执行从相关类创建XSD文件的任务,并且它正确地从运行时程序集中读取它们MyBaseClass,{{ 1}},...),创建以下xsd文件没有问题:

MyClassA

但是AFAIK,我将无法在xsd枚举中使用它。我假设我可以使用类属性来控制XSD输出的外观,但我尝试的大多数属性仅适用于属性/成员。

我希望生成类似于以下内容的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文件?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

我所知道的产品/图书馆可能无法满足您的需求。但是,就代码而言,将某些内容组合在一起应该相对容易,这样可以满足您的需求。

这就是我要做的事情,以限制我必须在文件结构,类的可见性等方面做出的假设数量。

首先,我将编译一个包含您要捕获的类的程序集列表。

对于该列表中的每个程序集,我将获得我需要的类型列表。反射装配的方法有很多种;假设程序集处于正确的上下文中(即所有依赖项都是可发现的),那么像这样的东西就可以轻松完成:

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

获取类型列表as you need

Type[] types = assembly.GetExportedTypes();

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

使用组合的类型列表构建一个简单的模式,只有一个简单的类型;使用System.Xml.Schema中的类。代码大致如下:

    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(...);
    }