c# – 使用空元素反序列化Xml
发布时间:2020-12-15 04:18:55 所属栏目:百科 来源:网络整理
导读:考虑以下 XML: a b2/b c/c/a 我需要将这个xml反序列化为一个对象.所以,我写了下面的课. public class A{ [XmlElement("b",Namespace = "")] public int? B { get; set; } [XmlElement("c",Namespace = "")] public int? C { get; set; }} 因为我正在使用nul
考虑以下
XML:
<a> <b>2</b> <c></c> </a> 我需要将这个xml反序列化为一个对象.所以,我写了下面的课. public class A { [XmlElement("b",Namespace = "")] public int? B { get; set; } [XmlElement("c",Namespace = "")] public int? C { get; set; } } 因为我正在使用nullables,所以我期待在解析上面的xml时,我会得到一个带有null C属性的对象A. 而不是这个,我得到一个异常,告诉文档有错误. 解决方法
缺少元素和null元素之间存在差异.
缺少元素< a>< b> 2< / b>< / a>.这里C将使用DefaultValue属性获取您指定的任何默认值,如果没有显式默认值,则为null. 空元素< a>< b> 2< / b>< c xs:Nil ='true'/>< / a>.在这里你将得到null. 当你做< a>< b> 2< / b>< c>< / c>< a /> xml序列化程序将尝试解析string.Empty作为整数,将正确失败. 由于您的提供程序生成无效的xml,因此如果使用XmlSerializer,则需要执行此操作: [XmlRoot(ElementName = "a")] public class A { [XmlElement(ElementName = "b")] public int? B { get; set; } [XmlElement(ElementName = "c")] public string _c { get; set; } public int? C { get { int retval; return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c,out retval) ? (int?) retval : null; } } } 或使用DataContractSerializer略微好一些 [DataContract(Name="a")] public class A1 { [DataMember(Name = "b")] public int? B { get; set; } [DataMember(Name = "c")] private string _c { get; set; } public int? C { get { int retval; return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c,out retval) ? (int?)retval : null; } } } 虽然如果这是一个问题,DataContractSerializer不支持属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |