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
相关产品推荐
相关产品推荐

