Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSD.exe生成枚举类型中不需要的字符串值,而不仅仅是文件中指定的数字值_C#_Xml_Xsd - Fatal编程技术网

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

C# XSD.exe生成枚举类型中不需要的字符串值,而不仅仅是文件中指定的数字值,c#,xml,xsd,C#,Xml,Xsd,我有一个和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"> <x

我有一个和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>
使用这种方法,当我从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>

不要使用

谢谢

我认为您的表述让评论员们感到困惑,因为“出现的值是字符串Item1或Item2”。在您共享的示例中,我可以看到您主要关心的是无法从枚举值获取“xml值”:

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值附加到枚举项的末尾来生成枚举项,这样您就可以从
值中删除

var quickCompanyCodeName = mLCCommodity.CompanyCode.ToString().Replace("Item",string.Empty);
Console.WriteLine(quickCompanyCodeName);
2.缓慢、复杂但风险较小 可以从枚举项读取属性并获取其值。您仍然依赖
xsd.exe
内部结构,这意味着它将始终使用此属性标记枚举条目,但我认为这比依赖枚举名称构造约定的风险要小得多。我使用它来获取属性值:

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

你能详细说明一下这个问题吗?“当我从xml文件读取数据时,得到的值是字符串Item1或Item2,而不是数字1或2”是什么意思?到哪里去?您是否收到例外情况?另外,我非常希望能够用完整的代码清单、xml示例和对预期行为的解释来解决这个问题。如果它是一个标准模式,我不建议更改,因为它可能会导致其他问题。如果需要整数值,只需在使用number:(int)代码的地方进行转换。或者在相反方向int myCode=1;公司代码=(公司代码)myCode;无论是谁编写了这个模式,都相信过度杀戮。使用枚举(1,2)定义一个整数类型肯定是您需要说的全部内容,而不用说它是一个非负整数,由一个数字组成,并且满足模式\d。同样的话说了四遍。他们按行编码有报酬吗?@MichaelKay很肯定你就在那里。我对xml/xsd了解不多,但对我来说它看起来很复杂。我想它可能是由XML Spy自动生成的。@fenixil我明天会收集一些东西作为示例,准备好后在注释中标记您。我想我将使用选项2。这正是我需要的。速度和复杂性不会成为问题,因为MLC商品信息很少(如果有)被修改。我宁愿少冒险。谢谢你的回答!
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);