我有一个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文件?如果是这样,怎么样?
答案 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(...);
}