我正在尝试将某些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>
,这不能满足我的需要。
有没有人有任何想法?
答案 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的模式,并基于它生成类,同时使用可空类型。