C#:从/向XML读取/写入DateTime

8

我需要知道将DateTime写入/从XML读取的最佳方式。我应该直接将DateTime写入XML还是将DateTime.ToString()写入XML?

第二个问题是如何从XML中读取日期元素。是否可以使用强制转换?例如:

(DateTime)rec.Element("Date").value

或者,我需要像这样解析字符串吗?例如:

DateTime.Parse(rec.Element("Date").value)

3个回答

20
你可以使用LINQ to XML中的XElementXAttribute类型进行类型转换,但不能将字符串本身强制转换。LINQ to XML使用标准的XML格式,独立于你的区域设置。

示例:

using System;
using System.Xml.Linq;

class Test
{    
    static void Main()
    {
        DateTime now = DateTime.Now;
        XElement element = new XElement("Now", now);

        Console.WriteLine(element);
        DateTime parsed = (DateTime) element;
        Console.WriteLine(parsed);
    }
}

请为我输出:

<Now>2011-01-21T06:24:12.7032222+00:00</Now>
21/01/2011 06:24:12

1
@Pankaj:我的意思是由LINQ to XML库执行的转换,就像我在答案中展示的那样。 - Jon Skeet
5
@Pankaj: “格式”本身并不是值的一部分。你绝对不应该只是在DateTime上调用ToString。这将得到取决于你运行它的计算机文化的XML。 “03/05/2011”是什么意思-5月3日还是3月5日?除非您也有格式信息(这不是值的一部分),否则它是模棱两可的。 XML格式是标准化的,并且不会受到此问题的影响。 - Jon Skeet
1
@Pankaj:那我建议你停止这样做 :) 如果你必须更新现有元素,可以使用 r.Element("Date").Value = XmlConvert.ToString(Date,XmlDateTimeSerializationMode.RoundtripKind); - Jon Skeet
1
@Pankaj:我认为你在使用它之前已经测试过日期不为空,现在我们已经远离了LINQ to XML,转向可空值类型的一般讨论。我建议你阅读有关这些细节的内容-这将有助于你处理这种以及其他情况。 - Jon Skeet
2
@Justin:看一下 XElement 的文档 - 它提供了一个自定义的显式转换。如果没有这个,它会在编译时失败。 - Jon Skeet
显示剩余13条评论

7

除了 @Jon Skeet 的答案之外,另一种方法是使用 "往返" 格式 将 DateTime 转换为字符串。这将把它转换为一个格式,可以保存和加载而不会丢失任何信息。

string dataToSave = myDateTime.ToString("o");

使用DateTime.Parse()进行转换。我链接的页面上有示例,展示了如何将其转换为/从字符串格式转换。您需要做的就是将此字符串存储到XML中。这样可以更好地控制数据的存储方式(如果您需要更多的控制)。

更多的控制权,但是可移植性较差。XML有标准化的存储日期和时间的方法 - 我认为在故意偏离它们之前应该仔细考虑。 - Jon Skeet
@Jon:是的,我试图指出一种更通用的无损序列化/反序列化文本的方法,但我表达得不太好 - 正如你所说,我有点偏离了重点 :-) - Jason Williams

5
你可以使用 XmlConvert 类来将数据与字符串相互转换,具体使用方法请参考这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接