处理异常在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"));
}
}
如果您的任何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循环中遍历。