简体   繁体   English

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

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

I have and xsd file that contains a enumerated type with options of 1 or 2. This is an extract of the file that contains the enum type CompanyCode我有一个包含枚举类型和选项 1 或 2 的 xsd 文件。这是包含枚举类型 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>

Running this file through xsd.exe /c test.xsd gives me ac# file that contains this code for the definition of the CompanyCode enum.通过xsd.exe /c test.xsd运行此文件为我提供了 ac# 文件,其中包含用于 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,
}

Using this, when I read the data from the xml file, the values that come is the string Item1 or Item2, rather than the digits 1 or 2.使用这个,当我从 xml 文件中读取数据时,出现的值是字符串 Item1 或 Item2,而不是数字 1 或 2。

Should I just use a switch statement to convert the values to the 1 and 2 that I need to store in the destination, or is there a way I can get the xml file to read the 1 or 2 directly?我应该只使用 switch 语句将值转换为我需要存储在目标中的 1 和 2,还是有办法让 xml 文件直接读取 1 或 2?

A typical record in the xml file looks like this xml文件中的一条典型记录是这样的

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

Thanks谢谢

I think you confused commentators by expression 'the values that come is the string Item1 or Item2'.我认为您通过表达“来的值是字符串 Item1 或 Item2”混淆了评论员。 In the example that you shared I can see that your main concern is that you cannot get 'xml value' from enum value:在您共享的示例中,我可以看到您主要担心的是您无法从枚举值中获取“xml 值”:

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

I see several ways to achieve what you need:我看到了几种实现您需要的方法:

1. Quick, simple but risky 1. 快速、简单但有风险

I checked that xsd.exe generates enum entries by convention appending xml value to the end of the enum entry so you can just remove Item from the value :我检查了xsd.exe生成枚举条目,将 xml 值附加到枚举条目的末尾,这样您就可以从value删除Item

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

2. Slow, complex but less risky 2. 缓慢、复杂但风险较小

You can read attribute from the enum item and get it's value.您可以从枚举项中读取属性并获取它的值。 You still rely on the xsd.exe internals implying that it will always mark enum entries with this attribute, but I think that is much less risky than rely on the enum name construction convention.您仍然依赖xsd.exe内部结构,这意味着它将始终使用此属性标记枚举条目,但我认为这比依赖枚举名称构造约定的风险要小得多。 I used this answer to get attribute value:我用这个答案来获取属性值:

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM