【问题标题】:Checking for null values if element does not exist如果元素不存在,则检查空值
【发布时间】:2017-09-07 19:44:04
【问题描述】:

我正在获取.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

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

【问题讨论】:

  • 注意——问题似乎是你在做 .Value on "null" aka null.Value
  • 如何使用空传播运算符 (?.),就像您在 if 条件中所做的那样...element.Element("comment")?.Value。或者只是LineComment = element.Element("comment") == null ? "" : element.Element("comment").Value;

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


【解决方案1】:

使用Null-conditional (?.) 运算符:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 在你的例子中element 不会是xe 吗?此外,您可能想指出您正在使用 null 条件运算符,这就是问题所在
    【解决方案3】:

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

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

    var LineKey = (string)element.Attribute("name");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多