首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSD2Code不生成可选Enum

XSD2Code不生成可选Enum
EN

Stack Overflow用户
提问于 2015-11-27 14:00:57
回答 1查看 1.2K关注 0票数 0

我遇到了一个很大的问题,从几个XSD生成C#类。在序列化过程中,Enum成员get的值是错误的。该属性不存在于我正在序列化的XML中,因此我希望它是NULL或'0',而是得到'1‘值,这是Enum中的第一个可用值。

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

person.xsd

代码语言:javascript
复制
<?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>

person XSD包含一个名为‘bassschema.xsd’的基本模式。那个文件是这样的;

basisschema.xsd

代码语言:javascript
复制
<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>

生成的代码如下所示;

Client.cs

代码语言:javascript
复制
[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;
        }
    }   
}

CdtSomeType.cs

代码语言:javascript
复制
[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;
        }
    }
}

我期望在CdtSomeType中有一个‘Person.cs’类型的可选属性,但是这种情况没有发生。现在,当我们使用以下代码序列化与此XSD匹配的XML文件时;

代码语言:javascript
复制
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’。这种情况在序列化过程中发生。我能做些什么来解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2016-01-06 15:38:58

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

就像这样

代码语言:javascript
复制
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LDTSomeEnumElementSpecified
    {
        get
        {
            return _verklaringField;
        }
        set
        {
            _verklaringField = value;
        }
    } 

基于这个属性(小心地,它需要有System.Xml.Serialization.XmlIgnoreAttribute()属性),您可以用代码来处理它,例如,这样做。

代码语言:javascript
复制
string tmp = deserializedObject.LDTSomeEnumElementSpecified ? deserializedObject.LDTSomeEnumElement.ToString() : String.Empty;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33959016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档