2015-09-28 3 views
0

У меня есть XML-клиент с полями даты, но иногда есть только даты. Мне нужен результат только с полями даты и времени и без полей даты. (Xml Я работаю со шляпой гораздо больше полей и вложен)Проанализируйте xml с преобразованием даты XDocument в 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