尝试检索配置属性时,NullReferenceException未处理错误

时间:2013-10-17 17:46:11

标签: c# linq-to-xml config nullreferenceexception xelement

    public string GetLogName(string config)
    {
        XDocument xDoc = XDocument.Load(config);
        XElement[] elements = xDoc.Descendants("listeners").Descendants("add").ToArray();

        foreach (var element in elements)
        {
            if (element.Attribute("fileName").Value != null)
            {
                string filename = element.Attribute("fileName").Value;
                int location = filename.IndexOf("%");
                Console.WriteLine("string to return: " + filename.Substring(0, location));
                return filename.Substring(0, location);
            }
        }
    }

我正在尝试从elements数组中的每个元素检索“fileName”属性,但在某些情况下,“fileName”属性不存在并因以下错误而失败:NullReferenceException未处理。对象引用未设置为对象的实例。

在我的情况下,有两个“添加”节点没有“fileName”属性,但第三个添加节点有它。

如何跳过没有“fileName”属性的条目,或者您是否可以推荐更好的方法来检索此属性?

3 个答案:

答案 0 :(得分:0)

您应该只需更改此行即可完成此操作:

if (element.Attribute("fileName").Value != null)

要:

if (element.Attribute("fileName") != null)

答案 1 :(得分:0)

将你的if语句更改为:

if (element.Attribute("fileName") != null)

答案 2 :(得分:0)

一种方法是在处理之前过滤掉列表:

XElement[] elements = xDoc.Descendants("listeners")
                          .Descendants("add")
                          .Where (d => d.Attribute("filename") != null )
                          .ToArray();

---恕我直言这就是我如何使用linq和regex ---

重写方法
var elements =
XDocument.Load(config);
         .Descendants("listeners")
         .Descendants("add")
         .Where (node => node.Attribute("filename") != null )
         .ToList();


return elements.Any() ? elements.Select (node => node.Attribute("filename").Value )
                                .Select (attrValue => Regex.Match(attrValue, "([^%]+)").Groups[1].Value)
                                .First ()
                      : string.Empty;