2015-09-28 59 views
0

我有带有日期时间字段的Customer XML,但有时只有日期。我只需要日期时间字段和日期字段的结果。 (这个xml我的帽子工作多得多,并且嵌套)使用XDocument解析xml将日期转换为datetime

我认为有一种更好的方式,那么我的蛮力尝试。

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</"); 
} 
+0

XML是如何生成的?你有任何控制权?你提到XDocument和Linq-to-xml - 你是如何生成它的? – simonalexander2005

+0

同意。如果可能的话,修复XML是解决此问题的正确方法,而不是编写代码来解决无效文档。试图修复不一致的数据通常会导致意大利面代码和令人头痛的问题(例如,当其他日期格式在XML中结束时,因为拥有的开发人员不遵循约定)。 – DVK

+0

没有必要修复,不应该修复。您需要时区来防止错误。没有时区,你会得到错误的日期。只需阅读日期并解析为DateTime对象,该对象将日期转换为正确的实际日期。 – jdweng

回答

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()))); 
+0

完美!我没有想到这个内容中的'DateTime.TryParse'。 – Lebewesen