[英]Xml Empty Tag Deserialization
你能帮我找一个反序列化包含空标签的xml文件的解决方案吗?
示例在这里:
<Report>
<ItemsCount></ItemsCount>
</Report>
我想将它反序列化为类的对象,如:
public class Report{
public int? ItemsCount { get;set;}
}
我在反序列化中使用的xml架构是:
[XmlRoot]
public partial class Report
{
private int? itemsCount;
[XmlElement(IsNullable = true)]
public int? ItemsCount {
get
{
return itemsCount;
}
set
{
itemsCount = value;
}
}
如果ItemsCount标记完全丢失,它可以很好地工作,但如果它存在并且同时为空,那么它会抛出有关此标记位于xml中的行的异常。
我在尝试寻找解决方案时看到了很多链接,但没有成功。
而且,我不想忽略所有情况的标记,我想得到一个空值而不是它是空的。
XmlSerializer试图将string.Empty
标记的值转换为整数并失败。 更改您的属性如下所示将数据类型转换为字符串:
[XmlElement]
public string ItemsCount {
get
{
return itemsCount;
}
set
{
itemsCount = value;
}
在上面的例子中,这将把属性Itemscount
设置为空。 对于上述属性的null
值,xml应如下所示:
<ItemsCount xs:Nil='true'/>
这种方法怎么样?
按如下方式定义类:
public class Report
{
[XmlIgnore]
public int? ItemsCount { get; set; }
}
由于XmlIgnore
属性,此标记将被视为未知。
创建序列化程序时添加事件处理程序:
var xs = new XmlSerializer(typeof(Report));
xs.UnknownElement += Xs_UnknownElement;
在事件处理程序中将空字符串解释为null:
private void Xs_UnknownElement(object sender, XmlElementEventArgs e)
{
var report = (Report)e.ObjectBeingDeserialized;
if (e.Element.InnerText == string.Empty)
report.ItemsCount = null;
else
report.ItemsCount = int.Parse(e.Element.InnerText);
}
像往常一样使用序列化器:
Report report;
using (var fs = new FileStream("test.xml", FileMode.Open))
{
report = (Report)xs.Deserialize(fs);
}
据我了解,所描述的行为是正确的; 如果缺少标签ItemsCount
,则其值为null
; 如果它是空的,它的值不能从""
转换为int?
的值int?
。 话虽这么说,有可能在ItemsCount
的访问器中实现一些自定义解析,这些访问器必须是string
类型。 但是,这似乎更像是一种解决方法。 如果可能,应将文档更改为开头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.