[英]How do I generate an xsd enumeration from C# classes?
我有一個XSD(XML模式定義)文件,該文件需要一個枚舉列表(限制),該列表由給定( ScoreService.App_Code.Entities
)命名空間中的所有類組成。
我使用XSD.EXE自動進入構建過程執行創建從相關類的XSD文件的任務,它從運行時組件正確讀取它們( MyBaseClass
, MyClassA
,...),創建以下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.