在 C# 中反序列化 XML 元素的存在以布尔

Posted

技术标签:

【中文标题】在 C# 中反序列化 XML 元素的存在以布尔【英文标题】:Deserialize XML element presence to bool in C# 【发布时间】:2012-05-23 01:24:00 【问题描述】:

我正在尝试将一些 XML 从 Web 服务反序列化为 C# POCO。我已经为我需要的大多数属性都提供了这个功能,但是,我需要根据元素是否存在来设置一个 bool 属性,但似乎看不到如何做到这一点?

一个示例 XML sn-p:

<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/空元素相关的所有其他问题似乎都涉及使用 Nullable&lt;T&gt;,这不能满足我的需要。

有人有什么想法吗?

【问题讨论】:

【参考方案1】:

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

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

[XmlIgnore]
public bool Target

    get
    
        return this.TempProperty != null;
    

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

【讨论】:

谢谢,想多了:)【参考方案2】:

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

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

【讨论】:

我正在反序列化来自 Google Search Appliance 的结果。如果结果是自动过滤的,则元素 &lt;FI/&gt; 存在于 &lt;RES&gt; 元素中,如果不是,则不存在。我需要设置一个属性来指示结果集是否被过滤 - 我看不出可以为空的布尔值在这种情况下有何帮助? 在这种情况下使用的 nullables 用于属性 tiself,而不是标记其是否为空/null 的布尔值。如果您不关心 FI 的内容并且只想检查它是否存在,那么 balthys 方法将完成这项工作。可空属性应该用于更高级的场景,当你想要检查的存在值是一个数字或任何其他将在你使用的类的实例中获得默认非空值的值时。如果 是数字类型,比如整数,并且你在你的类中使用 int FI,它的值总是 0,这与 null 不同。 谢谢,我了解 Nullable 的用途。但是,在这种情况下,它们不会比使用任何非值类型和 Balthy 建议的简单空检查更好。 &lt;FI/&gt; 元素从来没有值——它只是代表某事的元素的存在。所以Nullable&lt;T&gt; 的值总是default(T) 或null。

以上是关于在 C# 中反序列化 XML 元素的存在以布尔的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中反序列化 XML [重复]

如何在 C# 中反序列化具有前缀的 XML

C# Restful WCF 服务。无法在帖子正文中反序列化 XML

如何反序列化 C# 中只有属性的 xml 元素?

如何在 .NET 中反序列化为本地集合?

C# 在单个对象中反序列化两个 Jarray 对象