微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用空元素反序列化Xml

考虑以下 XML
<a>
    <b>2</b>
    <c></c>
</a>

我需要将这个xml反序列化为一个对象.所以,我写了下面的课.

public class A
{
    [XmlElement("b",Namespace = "")]
    public int? B { get; set; }

    [XmlElement("c",Namespace = "")]
    public int? C { get; set; }

}

因为我正在使用nullables,所以我期待在解析上面的xml时,我会得到一个带有null C属性的对象A.

而不是这个,我得到一个异常,告诉文档有错误.

解决方法

缺少元素和null元素之间存在差异.

缺少元素< a>< b> 2< / b>< / a>.这里C将使用DefaultValue属性获取您指定的任何认值,如果没有显式认值,则为null.

空元素< a>< b> 2< / b>< c xs:Nil ='true'/>< / a>.在这里你将得到null.

当你做< a>< b> 2< / b>< c>< / c>< a /> xml序列化程序将尝试解析string.Empty作为整数,将正确失败.

由于您的提供程序生成无效的xml,因此如果使用XmlSerializer,则需要执行此操作:

[XmlRoot(ElementName = "a")]
public class A
{
    [XmlElement(ElementName = "b")]
    public int? B { get; set; }

    [XmlElement(ElementName = "c")]
    public string _c { get; set; }

    public int? C
    {
        get
        {
            int retval;

            return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c,out retval) ? (int?) retval : null;
        }
    }
}

或使用DataContractSerializer略微好一些

[DataContract(Name="a")]
public class A1
{
    [DataMember(Name = "b")]
    public int? B { get; set; }

    [DataMember(Name = "c")]
    private string _c { get; set; }

    public int? C
    {
        get
        {
            int retval;

            return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c,out retval) ? (int?)retval : null;
        }
    }
}

虽然如果这是一个问题,DataContractSerializer不支持属性.

原文地址:https://www.jb51.cc/csharp/92114.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐