簡體   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