13

我正在尝试将 Web 服务中的一些 XML 反序列化为 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 和对象层次结构的一个非常简化的示例,但演示了我想要实现的目标。

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

有没有人有任何想法?

4

2 回答 2

15

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

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

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

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

于 2012-05-15T14:12:00.047 回答
0

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


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

于 2012-05-15T14:19:15.970 回答