繁体   English   中英

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

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

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

我使用XSD.EXE自动进入构建过程执行创建从相关类的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>

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

我希望产生一个类似于以下内容的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文件),是否有可能? 如果是这样,怎么办?

我所知没有产品/库可以满足您的需求。 但是,就代码而言,将某些东西放到一起可以提供您所需的确切信息相对容易。

这就是我要做的,这将限制我必须就文件结构,类的可见性等设定的假设数量。

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

对于该列表中的每个程序集,我都会得到所需的类型列表。 有很多方法可以反映装配体。 假设程序集在正确的上下文中(即所有依赖项均可发现),那么类似这样的方法就很容易了:

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

根据需要获取类型列表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM