XSD.exe 以枚举类型生成不需要的字符串值,而不仅仅是文件中指定的数字值

XSD.exe generating unwanted string values in enum type instead of just the digit values specified in the file

我有 xsd 文件,其中包含选项为 1 或 2 的枚举类型。这是包含枚举类型 CompanyCode

的文件的摘录
<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified"
     attributeFormDefault="unqualified">

     <xs:element name="HOST">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Header" type="Header" minOccurs="0"/>
                <xs:element name="MLC" minOccurs="0">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="MLCCommodity" type="MLCCommodity" maxOccurs="unbounded"/>
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
                <xs:element name="Departments" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Department" type="Department" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Type">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="1"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="CompanyCode">
      <xs:restriction base="xs:nonNegativeInteger">
        <xs:totalDigits value="1"/>
        <xs:pattern value="\d"/>
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
      </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="IDType">
        <xs:restriction base="xs:string">
            <xs:minLength value="5"/>
            <xs:maxLength value="8"/>
            <xs:pattern value="\d{5}"/>
            <xs:pattern value="\d{8}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="HostAction">
        <xs:restriction base="xs:string">
            <xs:length value="1"/>
            <xs:enumeration value="D"/>
            <xs:enumeration value="I"/>
            <xs:enumeration value="U"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="BusinessPillar">
        <xs:restriction base="xs:string">
            <xs:length value="3"/>
            <xs:enumeration value="ALM"/>
            <xs:enumeration value="CCC"/>
            <xs:enumeration value="CSD"/>
            <xs:enumeration value="CWD"/>
            <xs:enumeration value="IGA"/>
            <xs:enumeration value="TAS"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Header">
        <xs:sequence>
            <xs:element name="IDCode">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="IDType">
                            <xs:attribute name="Type" use="required">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:length value="1"/>
                                        <xs:enumeration value="C"/>
                                        <xs:enumeration value="I"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="CreationDate" type="xs:dateTime"/>
            <xs:element name="Version">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="5"/>
                        <xs:pattern value="\d\.\d\.\d"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="PricingZone" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:totalDigits value="2"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Business" type="BusinessPillar" minOccurs="0"/>
            <xs:element name="State">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="2"/>
                        <xs:maxLength value="3"/>
                        <xs:enumeration value="ACT"/>
                        <xs:enumeration value="NSW"/>
                        <xs:enumeration value="NT"/>
                        <xs:enumeration value="NZ"/>
                        <xs:enumeration value="QLD"/>
                        <xs:enumeration value="SA"/>
                        <xs:enumeration value="TAS"/>
                        <xs:enumeration value="VIC"/>
                        <xs:enumeration value="WA"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="MLCCommodity">
      <xs:sequence>
        <xs:element name="Description" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:minLength value="1"/>
              <xs:maxLength value="40"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="Number" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:length value="3"/>
            <xs:pattern value="\d{3}"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="CompanyCode" type="CompanyCode" use="required"/>
      <xs:attribute name="Action" type="HostAction" use="required"/>
    </xs:complexType>

    <xs:complexType name="Department">
        <xs:sequence>
            <xs:element name="Description" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="40"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="DepartmentNumber" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:length value="2"/>
                    <xs:pattern value="\d{2}"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="Action" type="HostAction" use="required"/>
    </xs:complexType>
</xs:schema>

运行 这个文件通过 xsd.exe /c test.xsd 给我一个 c# 文件,其中包含用于定义 CompanyCode 枚举的代码。

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
public enum CompanyCode {

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("1")]
    Item1,

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

使用这个,当我从 xml 文件中读取数据时,出现的值是字符串 Item1 或 Item2,而不是数字 1 或 2。

我应该只使用 switch 语句将值转换为我需要存储在目标位置的 1 和 2,还是有办法让 xml 文件读取 1 或2 直接?

xml 文件中的典型记录如下所示

<ns0:MLCCommodity Number="001" CompanyCode="1" Action="I">
  <ns0:Description>DO NOT USE</ns0:Description>
</ns0:MLCCommodity>

谢谢

我认为您用表达 'the values that come is the string Item1 or Item2' 混淆了评论员。在您分享的示例中,我可以看到您主要担心的是您无法从枚举值中获取 'xml value':

var mLCCommodity = new MLCCommodity() { CompanyCode = CompanyCode.Item2 };
// below gives you 'Item2', but you just want '2'
var value = mLCCommodity.CompanyCode.ToString();

我看到有几种方法可以满足您的需求:

1。快速、简单但有风险

我检查过 xsd.exe 通过将 xml 值附加到枚举条目末尾的惯例来生成枚举条目,因此您只需从 value 中删除 Item

var quickCompanyCodeName = mLCCommodity.CompanyCode.ToString().Replace("Item",string.Empty);
Console.WriteLine(quickCompanyCodeName);

2。缓慢、复杂但风险较小

您可以从枚举项中读取属性并获取它的值。您仍然依赖 xsd.exe 内部机制,这意味着它将始终使用此属性标记枚举条目,但我认为这比依赖枚举名称构造约定的风险要小得多。我用这个 answer 来获取属性值:

var enumType = typeof(CompanyCode);
var memberInfos = enumType.GetMember(mLCCommodity.CompanyCode.ToString());
var enumValueMemberInfo = memberInfos.FirstOrDefault(m => m.DeclaringType == enumType);
var valueAttributes = enumValueMemberInfo.GetCustomAttributes(typeof(XmlEnumAttribute), false);
var companyCodeName = ((XmlEnumAttribute)valueAttributes[0]).Name;
Console.WriteLine(companyCodeName);