【问题标题】:C# : Read/Write DateTime from/into XMLC#:从/到 XML 中读取/写入 DateTime
【发布时间】:2020-05-20 04:13:00
【问题描述】:

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

第二个问题是如何从 XML 中读取日期元素。可以使用铸造吗?例如:

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

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

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

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    您可以将XElementXAttribute 与LINQ to XML 一起使用,是的...但不是字符串本身。 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
    

    【讨论】:

    • @Pankaj:我的意思是 LINQ to XML 库执行的转换,如我的回答所示。
    • @Pankaj:format 不是初始值的一部分。您绝对应该只在 DateTime 上调用 ToString。这将为您提供 XML,这取决于您运行它的计算机的文化。 “03/05/2011”是什么意思 - 5 月 3 日或 3 月 5 日?除非您也有格式信息(这不是值的一部分),否则它是模棱两可的。 XML 格式是标准化的,不会出现这个问题。
    • @Pankaj:那么我建议你停止这样做 :) 如果你更新现有元素,你可以使用r.Element("Date").Value = XmlConvert.ToString(Date, XmlDateTimeSerializationMode.RoundtripKind);
    • @Pankaj:那么您需要指定Date.Value - 这只是使用可为空值类型的正常部分。请注意,如果您改用 XElement 构造函数,那只会发生魔法:)
    • @Justin:查看XElement 文档——它提供了自定义的显式转换。如果没有,它将在编译时失败。
    【解决方案2】:

    @Jon Skeet 的答案的替代方法是使用 "round trip" format 将 DateTime 转换为字符串。这会将其转换为可以保存和加载而不会丢失任何信息的格式。

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

    然后使用 DateTime.Parse() 再次转换回来。我链接到的页面有示例,向您展示如何转换为字符串格式/从字符串格式转换。您需要做的就是将此字符串存储到您的 XML 中。这使您可以更好地控制数据的存储方式(如果您想要更多控制权,那就是)。

    【讨论】:

    • 更多的控制,但更少的可移植性。 XML 具有存储日期和时间的标准化方法——在故意偏离它们之前我会仔细考虑。
    • @Jon:是的,我试图指出一种更通用的方式来无损地序列化文本到/从文本,但我并没有说得很好——正如你所说,我迷路了有点意思:-)
    【解决方案3】:

    您可以使用XmlConvert 类与字符串相互转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多