使用XElements处理foreach处理中的异常

时间:2015-05-21 09:15:17

标签: c#

我有一个foreach,迭代IEnumerable<XElement> 在某个时候,它会引发异常 System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.(翻译:&#34;未在对象实例上设置对象引用&#34;)
我解析一个XML DOM,找到一些特定的节点并尝试分析它们。 任何想法,如何避免这种情况?

这是我的代码:

var query = from p in dom.Descendants("meta")
                where (string)p.Attribute("name").Value == "custom.customer.ImageID" && p.Value != ""
                select p;

foreach (var el in query) 
{
    if (el is XElement && el.Value != null && el.Value != "") 
    {
        el.AddAfterSelf(this.getImageElement(el, "custom.customer.ImageUrl"));
    }
}

2 个答案:

答案 0 :(得分:2)

如果您的任何meta元素缺少name属性,则会抛出NullReferenceException:

p.Attribute("name").Value

您可以将XElements和XAttributes转换为字符串以获取其字符串值,您可以在此处执行此操作以避免异常:

var query = from p in dom.Descendants("meta")
            where (string)p.Attribute("name") == "custom.customer.ImageID" && 
                  p.Value != ""
            select p;

foreach (var el in query) 
{
    if (el is XElement && el.Value != null && el.Value != "") 
    {
        el.AddAfterSelf(this.getImageElement(el, "custom.customer.ImageUrl"));
    }
}

答案 1 :(得分:0)

您似乎试图访问不存在的属性。更改代码,以确保“name”属性不为null:

var query = from p in dom.Descendants("meta")
                where p.Attribute("name") != null && (string)p.Attribute("name").Value == "custom.customer.ImageID" && p.Value != ""
                select p;

您还应该评估这是否是最佳选择,或者这实际上只是忽略了错误/更深层次的问题。

根据您的评论判断,您应该知道当您开始迭代它时(即您正在使用延迟执行)执行您的特定Linq查询 - 而不是在您创建它时。有关详细信息,请参阅this

  

在返回值序列的查询中,查询变量   本身永远不会保存查询结果,只存储查询   命令。查询的执行将延迟到查询变量   在foreach或For Each循环中迭代。