Скажем, у меня есть следующий 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? В моей бизнес-логике допустимо, чтобы значение было нулевым. Спасибо!
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)
};
Вы можете просто использовать:
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
).
Для более читаемого синтаксиса и если вам нужна такая проверка несколько раз, вы можете использовать методы расширения:
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);
}
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)
};