[英]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.