代码之家  ›  专栏  ›  技术社区  ›  Andy May

linq to xml-分析datetime时检查空元素

  •  2
  • Andy May  · 技术社区  · 15 年前

    假设我有以下XML:

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

    我想使用linq to xml将其解析为一个我将调用account的对象:

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

    如果XML中存在元素,是否有一种方法只为accountexpiration分配日期?在我的业务逻辑中,值可以为空。谢谢!

    4 回复  |  直到 11 年前
        1
  •  2
  •   Mehrdad Afshari    15 年前
    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) 
      };
    
        2
  •  1
  •   Marc Gravell    15 年前

    您只需使用:

    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日期时间格式实现了这种魔力,如果元素不存在,它将返回空值(注意,我没有阅读 .Value )

        3
  •  0
  •   Alexander Kahoun    15 年前

    尝试:

    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)
                      };
    
        4
  •  0
  •   guppy81    11 年前

    对于更可读的语法,如果您需要多次这样的检查,可以使用扩展方法:

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