假设我有以下XML:
<Account>
<AccountExpirationDate>6/1/2009</AccountExpirationDate>
</Account>
我想使用LINQ to XML将其解析为一个我称之为Account的对象:
public class Account {
public DateTime? AccountExpirationDate { get; set; }
}
这是我尝试过的C#代码,但它不会让我使用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
};
如果元素存在于XML中,我是否有办法仅为AccountExpiration指定日期?在我的业务逻辑中,值为null是可以接受的。谢谢!
答案 0 :(得分: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)
};
答案 1 :(得分: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日期时间格式来运行这个魔法,并且如果该元素不存在则返回null(注意我不读.Value
)。
答案 2 :(得分:0)
尝试:
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)
};
答案 3 :(得分: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);
}