C# XSD2Code不生成可选枚举

C# XSD2Code不生成可选枚举,c#,xml,xsd,xsd.exe,xsd2code,C#,Xml,Xsd,Xsd.exe,Xsd2code,我在从几个XSD生成C#类时遇到了一个相当大的问题。序列化期间,枚举成员获取的值错误。我正在序列化的XML中不存在该属性,因此我希望它为NULL或“0”,但它会获取值“1”,这是枚举中的第一个可用值 假设我有一个名为“person.XSD”的XSD,它看起来像这样 person.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema> <xs:import namespace="http://www.som

我在从几个XSD生成C#类时遇到了一个相当大的问题。序列化期间,枚举成员获取的值错误。我正在序列化的XML中不存在该属性,因此我希望它为NULL或“0”,但它会获取值“1”,这是枚举中的第一个可用值

假设我有一个名为“person.XSD”的XSD,它看起来像这样

person.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema>
    <xs:import namespace="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1" schemaLocation="basisschema.xsd"/>
    <xs:complexType name="Person">
        <xs:annotation>
            <xs:documentation>Personal information</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="SomeType" type="ns:CDT_SomeType" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>Some type.</xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
<xs:schema targetNamespace="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1">
    <xs:complexType name="CDT_SomeType">
        <xs:annotation>
            <xs:documentation>Some type.</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="SomeEnumElement" type="ns:LDT_SomeEnumElement">
                <xs:annotation>
                    <xs:documentation>Some enum</xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
CdtSomeType.cs

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1", IsNullable = true)]
public class Client
{
    private CdtSomeType _someType;

    public Client()
    {
        _someType = new CdtSomeType();
    }

    public CdtSomeType SomeType
    {
        get
        {
            return _someType;
        }
        set
        {
            _someType = value;
        }
    }   
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1")]
public class CdtSomeType
{
    private LDTSomeEnumElement _someEnumElement;

    public LDTSomeEnumElement SomeEnumElement
    {
        get
        {
            return _verklaringField;
        }
        set
        {
            _verklaringField = value;
        }
    }
}
我希望Person.cs中有一个类型为“CdtSomeType”的可选属性,但这没有发生。现在,当我们使用下面的代码段序列化与这个XSD匹配的XML文件时

using (var reader = new StringReader(message))
{
    var myXmlObject = (Person)serializer.Deserialize(reader);

    //This value isn't available in the XML so I want this to be NULL instead of the default Enum value.
    var test = myXmlObject.SomeType.SomeEnumElement;
}

然后属性“SomeEnumElement”具有默认枚举值(1),而不是NULL或“0”。这在序列化期间发生。我能做些什么来解决这个问题

这里的问题是您的enum属性在xsd中不可为null。因此,在不更改xsd结构的情况下,它不能返回null或0(0也可以是枚举中的第一个元素)。XSD2Code还应生成属性,该属性告诉您此枚举元素是否存在于父元素中

像这样的

[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LDTSomeEnumElementSpecified
    {
        get
        {
            return _verklaringField;
        }
        set
        {
            _verklaringField = value;
        }
    } 
基于此属性(请小心,它需要具有[System.Xml.Serialization.XmlIgnoreAttribute()]属性),您可以在代码中以这种方式处理它

string tmp = deserializedObject.LDTSomeEnumElementSpecified ? deserializedObject.LDTSomeEnumElement.ToString() : String.Empty;