Linq to XML - 在解析DateTime时检查null元素

时间:2009-07-02 20:17:19

标签: c# .net linq-to-xml

假设我有以下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是可以接受的。谢谢!

4 个答案:

答案 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);
    }