You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# LINQ解析XML遇NullReferenceException问题求助

解决LINQ to XML解析时的NullReferenceException问题

你遇到的NullReferenceException主要是两个核心问题导致的,咱们一步步拆解修复:

问题1:未正确定位XML的层级关系

你的代码里用了xDoc.Elements("Component"),但你的XML根节点是<Components>,直接调用Elements("Component")会从文档最顶层查找名为Component的元素——而实际上Component是根节点<Components>的子元素,这一步根本找不到任何匹配项,后续链式调用自然返回null,最后调用ToString()就触发了空引用异常。

问题2:未处理属性可能为空的情况

如果某个Component没有ProductId属性,或者某个Row缺失Name/Value属性,直接访问.Value会立刻抛出NullReferenceException,咱们需要做空值防护。

修正后的代码

// 先定位到根节点<Components>下的所有<Component>子元素
var prop = xDoc.Root?
               .Elements("Component")
               // 先检查ProductId属性存在,再比较值
               .Where(c => c.Attribute("ProductId")?.Value == "ERDSIC")
               .Descendants("Row")
               // 同样先检查Name属性存在,再匹配目标值
               .Where(t => t.Attribute("Name")?.Value == "dampersize")
               // 检查Value属性存在后再取值
               .Select(v => v.Attribute("Value")?.Value)
               .FirstOrDefault();

// 输出时先判断是否为null,避免ToString()报错
Console.WriteLine("Result: " + (prop ?? "Not found"));

额外优化建议

如果想让代码更严谨,还可以用XAttribute的显式转换来简化空值处理,这种方式会自动把不存在的属性转为null,比直接访问.Value更安全:

// 用显式转换替代.Value访问
.Where(c => (string)c.Attribute("ProductId") == "ERDSIC")
.Where(t => (string)t.Attribute("Name") == "dampersize")
.Select(v => (string)v.Attribute("Value"))

内容的提问来源于stack exchange,提问作者bagofmilk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:53:43