如果元素不存在,则检查空值

时间:2017-09-07 19:44:04

标签: c# linq linq-to-xml resx xelement

我在.resx文件中获取了许多元素的值。在某些data元素上,<comment>子元素不存在,因此当我运行以下内容时,我将获得NullReferenceException

foreach (var node in XDocument.Load(filePath).DescendantNodes())
{
    var element = node as XElement;

    if (element?.Name == "data")
    {
        values.Add(new ResxString
        {
            LineKey = element.Attribute("name").Value,
            LineValue = element.Value.Trim(),
            LineComment = element.Element("comment").Value  //fails here
        });
    }
}

我尝试了以下内容:

LineComment = element.Element("comment").Value != null ? 
              element.Element("comment").Value : ""

LineComment = element.Element("comment").Value == null ?
              "" : element.Element("comment").Value

但是我仍然收到错误?任何帮助赞赏。

3 个答案:

答案 0 :(得分:2)

使用Null-conditional?.)运营商:

LineComment = element.Element("comment")?.Value 

用于在执行成员访问之前测试null

答案 1 :(得分:2)

如果你要使用Linq,请不要只是部分使用它: (只需扩展S. Akbari's Answer

values = XDocument.Load(filePath)
  .DescendantNodes()
  .Select(dn => dn as XElement)
  .Where(xe => xe?.Name == "data")
  .Select(xe => new new ResxString
  {
         LineKey = element.Attribute("name").Value,
         LineValue = element.Value.Trim(),
         LineComment = element.Element("comment")?.Value 
  })
  .ToList();  // or to array or whatever

答案 2 :(得分:0)

将元素或属性转换为可空类型就足够了。您将获得该值或null。

int64

var LineComment = (string)element.Element("comment");