我有一个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"));
}
}
答案 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循环中迭代。