在C#中将XML元素的存在反序列化为bool

时间:2012-05-15 13:57:04

标签: c# xml deserialization xml-deserialization

我正在尝试将某些XML从Web服务反序列化为C#POCO。我已经将这个工作用于我需要的大多数属性,但是,我需要根据元素是否存在来设置bool属性,但似乎无法看到如何执行此操作?

示例XML代码段:

<someThing test="true">
    <someThingElse>1</someThingElse>
    <target/>
</someThing>

示例C#类:

[Serializable, XmlRoot("someThing")]
public class Something
{
    [XmlAttribute("test")]
    public bool Test { get; set; }

    [XmlElement("someThingElse")]
    public int Else { get; set; }

    /// <summary>
    /// <c>true</c> if target element is present,
    /// otherwise, <c>false</c>.
    /// </summary>   
    [XmlElement("target")]
    public bool Target { get; set; }
}

这是我正在处理的实际XML和对象层次结构的一个非常简化的示例,但演示了我正在尝试实现的目标。

我读过的与反序列化null / empty元素相关的所有其他问题似乎都涉及使用Nullable<T>,这不能满足我的需要。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:13)

一种方法是使用不同的属性来获取元素的值,然后使用Target属性来获取该元素是否存在。像这样。

[XmlElement("target", IsNullable = true)]
public string TempProperty { get; set; }

[XmlIgnore]
public bool Target
{
    get
    {
        return this.TempProperty != null;
    }
}

即使存在空元素,TempProperty也不会为空,因此如果true存在,Target将返回<target />

答案 1 :(得分:0)

你能解释为什么你不想使用可空类型吗?
当你在ur poco中定义一个int(而不是int?)属性时,它并不真正代表底层的xml,你只需获取这些变量的默认值。
如果您假设您不会在ur xml中获得值为0的空/空字符串或整数,则可以使用Balthy为每个ur属性建议的方法,或use the method described here


一般来说,如果你真的希望你的类代表基础数据,我认为最好创建一个描述ur xml的模式,并基于它生成类,同时使用可空类型。

相关问题