C# XSD.exe生成枚举类型中不需要的字符串值,而不仅仅是文件中指定的数字值
我有一个和xsd文件,其中包含一个枚举类型,选项为1或2。这是包含枚举类型CompanyCode的文件的摘录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
<?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);