在C#类生成的XSD架构中包含键值对

时间:2015-01-30 01:42:43

标签: c# xml xsd

我有一个用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无法做到这一点。所以现在我需要知道我可以用什么工具来生成带有这些注释的模式,以及我必须放在我的类属性上以确保实际生成注释。

2 个答案:

答案 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