如何通过LINQ获取XML节点元素值?遇空指针异常求解决
问题分析与解决
空指针异常的原因
- 节点遍历范围错误:
doc.Element("ServiceUsers").Descendants()会取出ServiceUsers下所有层级的子元素(包括ID、USER_NAME这类叶子节点),循环时这些叶子节点本身没有Name子节点,调用Element("Name")会返回null,访问.Value直接触发空指针异常。 - 标签大小写不匹配:XML中的目标标签是大写的
NAME,但代码里用的是小写开头的"Name",即使定位到ServiceUser节点,也会因大小写不匹配找不到对应元素,返回null后访问.Value同样报错。
修正后的代码
XDocument doc = XDocument.Parse(xml); // 精准定位所有ServiceUser节点,而非所有子元素 IEnumerable<XElement> serviceUserElements = doc.Element("ServiceUsers").Elements("ServiceUser"); foreach (XElement serviceUser in serviceUserElements) { // 匹配大写标签,同时加入空值判断避免异常 string nameValue = serviceUser.Element("NAME")?.Value ?? "无名称"; comboBoxServiceUser.Items.Add(nameValue); // 提取其他字段的统一写法(同样加入空值防护) string id = serviceUser.Element("ID")?.Value; string userName = serviceUser.Element("USER_NAME")?.Value; string unId = serviceUser.Element("UN_ID")?.Value; string ip = serviceUser.Element("IP")?.Value; }
关键优化说明
- 用
Elements("ServiceUser")替代Descendants(),直接获取每个ServiceUser父节点,避免遍历到无关的叶子节点。 - 严格匹配XML标签的大小写(
NAME而非Name)。 - 使用空传播运算符
?.和空合并运算符??处理可能的空元素,从根源避免空指针异常。
内容的提问来源于stack exchange,提问作者mrsamkhar
相关产品推荐
相关产品推荐

