Linq to XML - проверка на нулевой элемент при разборе DateTime

2

Скажем, у меня есть следующий XML:

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

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

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

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

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
  };

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

  • 0
    @Mehrdad - Спасибо за исправление формата, это было некрасиво.
Теги:
linq-to-xml

4 ответа

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: строка не была распознана как допустимый DateTime
  • 0
    @ Энди Мэй: вы сказали, что элемент существует или нет ... вы не сказали, что он пустой ...
Показать ещё 6 комментариев
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
};

существует оператор преобразования, который работает с этой магией с использованием стандартного форматирования datetime xml и возвращает значение null, если элемент не существует (обратите внимание, что я не читаю .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);
    }
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)
                  };

Ещё вопросы

Сообщество Overcoder
Наверх
Меню