C# 如何反序列化DateTime对象列表?
如果我有以下XML段:C# 如何反序列化DateTime对象列表?,c#,.net,xml-serialization,C#,.net,Xml Serialization,如果我有以下XML段: <Times> <Time>1/1/1900 12:00 AM</Time> <Time>1/1/1900 6:00 AM</Time> </Times> 但是,当我使用DateTime作为类型而不是string(对于List类型和XmlArrayItem类型),我会得到以下错误: 字符串“1/1/1900 12:00 AM”不是有效的AllXsd值。 谢谢 对于DateTime,我认为问题
<Times>
<Time>1/1/1900 12:00 AM</Time>
<Time>1/1/1900 6:00 AM</Time>
</Times>
但是,当我使用DateTime作为类型而不是string(对于List类型和XmlArrayItem类型),我会得到以下错误:
字符串“1/1/1900 12:00 AM”不是有效的AllXsd值。
谢谢 对于
DateTime
,我认为问题的很大一部分是xml的格式错误;这不是日期的xsd标准。。。你能影响xml吗?否则,您可能必须坚持使用字符串,然后再进行处理
更标准的xml是:
<Times>
<Time>1900-01-01T00:00:00</Time>
<Time>1900-01-01T06:00:00</Time>
</Times>
1900-01-01T00:00:00
1900-01-01T06:00:00
例如:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class Data
{
[XmlArray("Times")]
[XmlArrayItem("Time")]
public List<DateTime> Times { get; set; }
static void Main()
{
XmlReader xr = XmlReader.Create(new StringReader(@"<Data><Times>
<Time>1900-01-01T00:00:00</Time>
<Time>1900-01-01T06:00:00</Time>
</Times></Data>"));
XmlSerializer ser = new XmlSerializer(typeof(Data));
Data data = (Data) ser.Deserialize(xr);
// use data
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
公共类数据
{
[XmlArray(“Times”)]
[XmlArrayItem(“时间”)]
公共列表时间{get;set;}
静态void Main()
{
XmlReader xr=XmlReader.Create(新建StringReader(@)”
1900-01-01T00:00:00
1900-01-01T06:00:00
"));
XmlSerializer ser=新的XmlSerializer(typeof(Data));
数据=(数据)序列反序列化(xr);
//使用数据
}
}
看看msdn文章:
它建议将DateTime对象标记为:
[System.Xml.Serialization.XmlElementAttribute(“发布日期”,
DataType=“date”)]public System.DateTime publicationdate 最简单的方法是创建一个新属性,该属性被序列化而不是Times属性,并处理格式设置:
[XmlIgnore]
public IList<DateTime> Times { get; set; }
[XmlArray("Times")]
[XmlArrayItem("Time")]
public string[] TimesFormatted
{
get
{
if (this.Times != null)
return this.Times.Select((dt) => dt.ToString("MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToArray();
else
return null;
}
set
{
if (value == null)
this.Times = new List<DateTime>();
else
this.Times = value.Select((s) => DateTime.ParseExact(s, "MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToList();
}
}
[XmlIgnore]
公共IList时间{get;set;}
[XmlArray(“Times”)]
[XmlArrayItem(“时间”)]
公共字符串[]已格式化
{
得到
{
如果(this.Times!=null)
返回此.Times.Select((dt)=>dt.ToString(“MM/dd/yyyy hh:MM tt”,CultureInfo.InvariantCulture)).ToArray();
其他的
返回null;
}
设置
{
如果(值==null)
this.Times=新列表();
其他的
this.Times=value.Select((s)=>DateTime.ParseExact(s,“MM/dd/yyyy hh:MM tt”,CultureInfo.InvariantCulture)).ToList();
}
}
+1谢谢!如果这是问题所在,那么我可能会包含一条XML注释,精确地说明这一点。我认为这些价值观不会经常改变(如果有的话)。在.NET中是否有一种内置机制,可以将XML元素值反序列化为DateTime对象,而不使用您提供的格式(例如,可能是我提供的转换器类或其他格式)?因为我只对时间(而不是日期)感兴趣,所以现在使用xsd:time。有效时间显示在此页底部:,可以反序列化为.NET DateTime对象。你提供的例子很有帮助。谢谢重新注释-是的,如果数据格式正确,您可以自动序列化/反序列化;请参阅update。是否知道为什么这只适用于CultureInfo.InvariantCulture
和ParseExact
,而不适用于CultureInfo.InvariantCulture
和“normal”Parse
?在我的代码中,单个DateTime
不是问题
[XmlIgnore]
public IList<DateTime> Times { get; set; }
[XmlArray("Times")]
[XmlArrayItem("Time")]
public string[] TimesFormatted
{
get
{
if (this.Times != null)
return this.Times.Select((dt) => dt.ToString("MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToArray();
else
return null;
}
set
{
if (value == null)
this.Times = new List<DateTime>();
else
this.Times = value.Select((s) => DateTime.ParseExact(s, "MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToList();
}
}