我有一个用C#编写的课程。此类现在将用于将XML文档发布到API的API中。我需要生成一个模式(XSD)来指示将要发布的XML文件的规则。
我真正在努力的是一种注释(?)我的类的方法,以便模式列出类中某些属性的可能值。我将使用“xsd.exe”生成XSD。
可能的值需要列为键值对。例如我有一个名为Gender的属性,其中可能的值为“M”和“F”。这些都是显而易见的,因为它们的意思是“男性”和“女性”。
不太明显的是我的财产“StType”(街道类型)。例如一些有效值是“AC”,“AL”,“AN”,“AP”,“AR”和“AV”。这些对应于“Access”,“Alley”,“Anchorage”,“Approach”,“Arcade”和“Avenue”。
所以我想要的是一种用键值对标记我的类属性的方法,这些键值对将被转换为我的模式。 “XmlElementRestrictionsList”在下面编写,但我想要做出类似的事情。
[XmlElementRestrictionsList{"M":"Male", "F":"Female"}]
public string Gender { get; set; }
这反过来会生成类似
的模式<xsd:element name="Gender" minOccurs="1">
<xsd:restriction type="string">
<xs:enumeration value="Male, M" />
<xs:enumeration value="Female, F" />
</xsd:restriction>
</xsd:element>
我不知道这是否实际上是架构如何写出来的,但希望它足以让我了解我想要实现的目标。
我已经搜索了很多关于字符串枚举但是1.我不完全确定如何在我的班级中做到这一点2.更重要的是,我没有看到任何暗示键值对是一个选项。我不希望我的值对应于枚举号(“M”= 1,“F”= 2)。
这可能是一个非常简单的额外内容,如何在模式中标记需要某些内容(在我的课程中,为模式生成器做好准备)?例如Gender,FirstName和LastName(我班级中的所有字符串)必须包含在已发布的XML中,而标题和电话可能完全丢失。我假设这是“minOccurs”的含义。虽然我的意思是要求的最小数量可能不是多次。
[XmlElementRequired]
public string Gender { get; set; }
[编辑]
从类属性设置开始,除了实际生成的模式之外,还可以按需要工作。这就是我真正追求的目标。
C#cde生成一个模式如下:
<xs:simpleType name="Gender">
<xs:restriction base="xs:string">
<xs:enumeration value="M" />
<xs:enumeration value="F" />
</xs:restriction>
</xs:simpleType>
遗憾的是,这不包括我的描述。如何在架构中获取说明?
我真正需要的是:
<xs:simpleType name="Gender">
<xs:restriction base="xs:string">
<xs:enumeration value="M" description="Male" />
<xs:enumeration value="F" description="Female" />
</xs:restriction>
</xs:simpleType>
我不相信这实际上是XSD标准的一部分,所以很明显这是不可能的。希望它能解决我的观点。进一步的研究显示了一些关于“注释”但我不知道如何将它们应用于我的枚举值,而这些值又将应用于我生成的模式。
此处的简短示例均使用性别,这很容易确定值的含义。但是,如果我使用的是我的StType属性,则枚举“value”不具有描述性。
[编辑2]
我想要生成的模式看起来应该是这样的:
<xs:simpleType name="Gender">
<xs:restriction base="xs:string">
<xs:enumeration value="M">
<xs:annotation>
<xs:documentation>Male</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="F">
<xs:annotation>
<xs:documentation>Female</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
我的研究似乎暗示使用xsd.exe无法做到这一点。所以现在我需要知道我可以用什么工具来生成带有这些注释的模式,以及我必须放在我的类属性上以确保实际生成注释。
答案 0 :(得分:1)
在玩了各种各样的可能之后,我设法得到了一个有效的版本。
最终它是&#34; GetDescription&#34;到最后让我在那里的链接。最顶层的代码没有帮助,但评论部分失败了。
我的最终解决方案是按如下方式创建枚举:
public enum Gender {
[Description("M")]
[System.Xml.Serialization.XmlEnumAttribute("M")]
Male,
[Description("F")]
[System.Xml.Serialization.XmlEnumAttribute("F")]
Female
}
按如下方式设置我的类属性:
public Gender Gender1 { get; set; }
按照以下方式映射我发布的XML:
Tools.GetDescription(data.Gender1);
使用以下方法:
public class Tools
{
public static string GetDescription(Enum en)
{
FieldInfo fi = en.GetType().GetField(en.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(
typeof(DescriptionAttribute), false);
return (attributes.Length > 0) ? attributes[0].Description : en.ToString();
}
}
答案 1 :(得分:0)
试试这个
将您的Gender
字段从string
更改为enum
类型,如列表所示,并在枚举字段中添加XmlEnumAttribute
。
public enum Gender
{
[System.Xml.Serialization.XmlEnumAttribute("M")]
Male,
[System.Xml.Serialization.XmlEnumAttribute("F")]
Female
}
选中此msdn doc