【问题标题】:Parse xml with XDocument convert date to datetime使用 XDocument 解析 xml 将日期转换为日期时间
【发布时间】:2015-09-28 15:10:59
【问题描述】:

我有带有日期时间字段的客户 XML,但有时只有日期。我需要一个只有日期时间字段而没有日期字段的结果。 (我使用的 xml 包含更多字段并且是嵌套的)

我认为有比我的蛮力尝试更好的方法。

xml = "<root><date>2003-07-15T10:00:00</date><enddate>2016-02-02</enddate><startdate>2000-02-10</startdate></root>";
string result = string.Empty;
if (!string.IsNullOrWhiteSpace(xml))
{
  XDocument doc = XDocument.Parse(xml);
  string xml1 = doc.ToString();
  Regex rgx = new Regex(@">(\d{4}-\d\d-\d\d)</");
  result = rgx.Replace(xml1, ">$1T00:00:00</");
}

【问题讨论】:

  • XML 是如何生成的?你对此有任何控制权吗?您提到了 XDocument 和 Linq-to-xml - 这就是您生成它的方式吗?
  • 同意。如果可能,修复 XML 是解决此问题的正确方法,而不是编写代码来解决无效文档。尝试修复不一致的数据通常会导致意大利面条式代码和令人头疼的问题(例如,当某些其他日期格式最终出现在 XML 中时,因为拥有的开发人员没有遵循约定)。
  • 没有什么需要修复,也不应该修复。您需要时区来防止错误。如果没有时区,您将得到错误的日期。只需读取日期并解析为 DateTime 对象,该对象会将日期转换为正确的实际日期。
  • 我需要解析旧的 XML 文件并将它们传递给另一个程序。我无法控制文件内容和其他程序。另一个程序需要日期时间字段。我必须编写一个解析器将它们粘合在一起......

标签: c# date parsing datetime linq-to-xml


【解决方案1】:

这是你的意思吗?

string xml = @"<root><date>2003-07-15T10:00:00</date>
<enddate>2016-02-02</enddate>
<startdate>2000-02-10</startdate>
</root>";

  XDocument doc = XDocument.Parse(xml);

  DateTime t;
  doc
    .DescendantNodes()
    .Where (d => d.NodeType == XmlNodeType.Text && 
      DateTime.TryParse(d.ToString(),out t))
    .ToList()
    .ForEach( n => n.Parent.SetValue(DateTime.Parse(n.ToString())));

【讨论】:

  • 完美!没想到这个内容里有DateTime.TryParse。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2021-05-09
  • 2013-03-27
相关资源
最近更新 更多