2009-07-02 2 views
2

Допустим, у меня есть следующий XML:Linq в XML - Проверка нулевого элемента при разборе для DateTime

<Account> 
     <AccountExpirationDate>6/1/2009</AccountExpirationDate> 
</Account> 

Я хочу использовать LINQ для XML для разбора этого в объект Я позвоню счета:

public class Account { 
    public DateTime? AccountExpirationDate { get; set; } 
} 

Это C# код, который я пытался, но он не позволит мне использовать нуль:

var accountSettings = 
    from settings in templateXML.Descendants("Account") 
    select new Account { 
     AccountExpirationDate = 
     string.IsNullOrEmpty(settings.Element("AccountExpirationDate").Value) 
     ? DateTime.Parse(settings.Element("AccountExpirationDate").Value) 
     : null 
    }; 

есть ли способ для меня ONl y назначить AccountExpiration дату, если элемент существует в XML? В моей бизнес-логике допустимо, чтобы значение было нулевым. Благодаря!

+0

@Mehrdad - Спасибо за формат исправить, это было некрасиво раньше. –

ответ

2
var accountSettings = 
    from settings in templateXML.Descendants("Account") 
    select new Account { 
    AccountExpirationDate = 
     string.IsNullOrEmpty((string)settings.Element("AccountExpirationDate")) 
      ? (DateTime?)null 
      : DateTime.Parse(settings.Element("AccountExpirationDate").Value) 
    }; 
+0

Это вызывает исключение, когда элемент AccountExpirationDate пуст: System.FormatException: String не была признана действительной DateTime –

+0

@ Andy May: вы сказали о существующем элементе или нет ... вы не сказали, что он пуст. .. –

+0

Энди: Обновлен ответ. Ваш оригинальный фрагмент не использовал 'string.IsNullOrEmpty' правильно, и я слепо скопировал и вложил это. Мы должны вернуть 'null', если метод возвращает' истина', а не наоборот. –

0

Try:

var accountSettings = from settings in templateXML.Descendants("Account") 
        where settings.Element("AccountExpriationDate") != null 
        && !String.IsNullOrEmpty(settings.Element("AccountExpriationDate").Value) 
        select new Account 
        { 
         AccountExpirationDate = DateTime.Parse(settings.Element("AccountExpirationDate").Value) 
        }; 
1

Вы можете просто использовать:

from settings in templateXML.Descendants("Account") 
let el = settings.Element("AccountExpirationDate") 
let el2 = (el == null || string.IsNullOrEmpty(el.Value)) ? null : el 
select new Account { 
    AccountExpirationDate = (DateTime?)el2 
}; 

есть оператор преобразования, который работает это волшебство, используя стандартное форматирование XML DATETIME, и который возвращает нулевое значение, если элемент (примечание я не читаю .Value).

+0

Это вызовет исключение, если элемент существует, но пуст. –

+0

(исправлено, но это не было требование в исходном вопросе) –

0

Для более читаемого синтаксиса и если вам нужны такая проверка несколько раз, вы можете использовать методы расширения:

public static DateTime? ToDateTime(this Element e) 
    { 
     if (e == null) 
      return null; 

     if (string.IsNullOrEmpty(e.Value)) 
      return null; 
     else 
      return DateTime.Parse(e.Value); 
    } 
Смежные вопросы