【发布时间】:2015-12-03 23:15:57
【问题描述】:
我有一个 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 文件?如果有,怎么做?
【问题讨论】:
-
您知道枚举的成员是字符串,而不是类名吗?当然你可以在代码中创建一个
enum ParamTypeRestriction { MyBaseClass, MyClassA, ... },这会产生你想要的xsd,但这可能不是你想要做的,因为枚举值与类无关,只是它们碰巧有相同的名称. -
@Martin 我真正需要的是给定命名空间中所有类(每个类都是字符串)的 names 编译成 XSD 中的枚举。基本上这样我就可以为 XML 文件自动更新这些类的列表。
-
好吧,如果每个文件有一个类,并且文件以该类命名,则基本上可以使用
dir来创建具有此类枚举的文件,但这会有点骇人听闻的...... -
命名空间层次结构无论如何都反映了目录设置,所以这实际上是一个相当不错的想法,而且在代码一致性方面一点也不骇人听闻。毕竟只需要类名。
标签: c# visual-studio xsd xsd.exe