C#从xml反序列化日期时间

Posted

技术标签:

【中文标题】C#从xml反序列化日期时间【英文标题】:C# deserialize datetime from xml 【发布时间】:2016-04-16 00:07:13 【问题描述】:

我必须用如下所示的日期反序列化 xml:

<date>2015/10/16 00:00:00.000000000</date>

我的班级包含这个字段:

[XmlAttribute("date")]
public DateTime StartDate  get; set; 

但我总是收到默认日期。是否可以解析这种格式的日期时间?

编辑: 当我将 XmlAttribute 更改为 XmlElement 时,出现异常:

There is an error in XML document

所以我认为 DateTime 可以解析这种格式。

【问题讨论】:

Force XmlSerializer to serialize DateTime as 'YYYY-MM-DD hh:mm:ss'的可能重复 还有Can you specify format for XmlSerialization of a datetime?。 [XmlElement] 是要使用的正确注解,您会使用 [XmlAttribute("date")] 获得默认的 DateTime 值,因为元素值被忽略了。 【参考方案1】:

处理此问题的一种方法是使用 DateTime 成员装饰 [System.Xml.Serialization.XmlIgnore]

这告诉序列化程序根本不对其进行序列化或反序列化。

然后,向该类添加一个附加属性,例如 DateString。它可能被定义为

public string DateString 
    set  ... 
    get  ... 

然后您可以在 get/set 逻辑中对 DateString 进行序列化和反序列化:

public string DateString 
    set 
    // parse value here - de-ser from your chosen format
    // use constructor, eg, Timestamp= new System.DateTime(....);
    // or use one of the static Parse() overloads of System.DateTime()
    
    get 
        return Timestamp.ToString("yyyy.MM.dd");  // serialize to whatever format you want.
    

在 get 和 set 中,您正在操作 Date 成员的值,但您正在使用自定义逻辑进行操作。序列化的属性当然不必是字符串,但这是一种简单的方法。您也可以使用 int 进行 ser/de-ser,例如使用 unix 纪元

迪诺·基耶萨

【讨论】:

以上是关于C#从xml反序列化日期时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 代码和 F# 模型的 XML 反序列化

C# 在忽略命名空间的同时反序列化 xml

无法使用 c# xmlserializer 反序列化以前序列化的 XML

无法使用 C# 客户端反序列化日期时间属性 Neo4j

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

C# XML对象序列化反序列化 - PEPE YU