xsd.exe生成XML,其中“item”前缀为枚举

时间:2014-08-25 21:13:11

标签: c# .net xml xsd.exe

我正在尝试从XSD文件生成c#代码,并且枚举前面加上单词Item。如何使这个枚举只是数字?所有这一切的要点是有一个枚举,只能使用数字而不使用Min / Max值限制类型。我们不希望这样限制它,因为我们将此XSD分发给客户端并且需要XSD中的注释。我们也喜欢在c#代码中使用枚举。我们可以手动编辑生成的代码,但如果我们可以在xsd中修复它,我就不会疯狂。有什么想法吗?

相关的XSD架构

<xs:simpleType name="DriverActionsCode">
    <xs:restriction base="xs:token">
      <xs:enumeration value="00" />
      <!--No Action-->
      <xs:enumeration value="01" />
      <!--Exceeded Safe/Posted Speed Limit-->
      <xs:enumeration value="02" />
      <!--Impeded Traffic-->
      <xs:enumeration value="03" />
      <!--Failed to Yield ROW-->
      <xs:enumeration value="04" />
      <!--Disregarded Stop Sign-->
      <xs:enumeration value="05" />
      <!--Failed to Stop at Signal-->
      <xs:enumeration value="06" />
      <!--Disregarded Other Device-->
      <xs:enumeration value="07" />
      <!--Improper Turn-->
      <xs:enumeration value="08" />
      <!--Turned from Wrong Lane or Position-->
      <xs:enumeration value="09" />
      <!--Other Improper Turns-->
      <xs:enumeration value="10" />
      <!--Lane Violation-->
      <xs:enumeration value="11" />
      <!--Improper Passing on Left-->
      <xs:enumeration value="12" />
      <!--Improper Passing on Right-->
      <xs:enumeration value="13" />
      <!--Followed Too Closely-->
      <xs:enumeration value="14" />
      <!--Improper Backing-->
      <xs:enumeration value="15" />
      <!--Signaling Violation-->
      <xs:enumeration value="16" />
      <!--Reckless Driving-->
      <xs:enumeration value="17" />
      <!--Careless Driving-->
    </xs:restriction>
  </xs:simpleType>

生成的类

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.18020")]
[System.SerializableAttribute()]
public enum DriverActionsCode
{

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("00")]
    Item00,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("01")]
    Item01,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("02")]
    Item02,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("03")]
    Item03,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("04")]
    Item04,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("05")]
    Item05,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("06")]
    Item06,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("07")]
    Item07,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("08")]
    Item08,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("09")]
    Item09,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("10")]
    Item10,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("11")]
    Item11,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("12")]
    Item12,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("13")]
    Item13,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("14")]
    Item14,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("15")]
    Item15,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("16")]
    Item16,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("17")]
    Item17,
}

1 个答案:

答案 0 :(得分:2)

你不能,xsd.exe并不真正支持这些自定义。即使你可以,它也不是有效的C#。

例如,这个枚举不会编译:

enum DriverActionsCode
{
    00,
    01,
    //etc.
}

标识符必须以字符或下划线开头。从C#spec的2.4.2开始:

identifier-start-character:
   letter-character
   _ (the underscore character U+005F)

但是,如果您的编号从0开始并且没有间隙(如上例所示),则可以在代码中使用整数并将其强制转换为枚举。

例如:

Int32 codeInApplication = 10;

DriverActionsCode codeForXml = (DriverActionsCode)codeInApplication;
//DriverActionsCode.Item10;