处理异常在foreach处理与XElements

本文关键字:处理 XElements 异常 foreach | 更新日期: 2023-09-27 17:50:08

我有一个foreach,迭代一个IEnumerable<XElement>
有时,它会抛出一个异常System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.(翻译:"对象引用未在对象实例上设置")
我确实解析了一个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"));
    }
}

处理异常在foreach处理与XElements

如果您的任何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"));
    }
}

您似乎正在尝试访问一个不存在的属性。修改代码,确保"name"属性不为空:

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查询是在你开始迭代它的时候执行的(也就是说,你在使用延迟执行),而不是在你创建它的时候。查看详细信息:

在返回值序列的查询中,查询变量本身从不保存查询结果,而只存储查询命令。查询的执行被延迟到查询变量在foreach或For Each循环中遍历。