C#编辑XML子元素属性时出现空引用错误该如何解决
问题修复说明
报错根因
你触发空引用错误的核心原因有两个:
- 查询
pathNode时用修改后的fileLocTxt.Text作为搜索条件,修改路径后XML中原有path节点的content属性和新的路径值不匹配,直接返回null,访问null的Attributes属性就会抛出空引用异常。 - 现有查询逻辑无法保证找到的
pathNode和nameNode属于同一个<setting>节点,可能会误改其他配置的路径属性。
修复代码
你不需要单独查询path节点,找到匹配的nameNode后直接从它的父节点(对应所属的<setting>节点)下取path子节点修改即可,调整后的else分支逻辑如下:
else { settXML.Load("settings.xml"); // 仅按名称查询对应节点即可 string nameXPath = "date-changer/setting/name[@content='{0}']"; nameXPath = string.Format(nameXPath, nameTxt.Text); XmlNode nameNode = settXML.SelectSingleNode(nameXPath); if (nameNode != null) { consoleLog.AppendText("Found File"); consoleLog.AppendText(Environment.NewLine); // 获取当前name节点所属的setting父节点 XmlNode currentSetting = nameNode.ParentNode; // 从当前setting下查找对应的path子节点,不会找错其他配置 XmlNode pathNode = currentSetting.SelectSingleNode("path"); // 增加判空逻辑避免极端情况报错 if (pathNode?.Attributes?["content"] != null) { // 仅当路径值发生变更时才修改 if (pathNode.Attributes["content"].Value != fileLocTxt.Text) { pathNode.Attributes["content"].Value = fileLocTxt.Text; // 同步更新InnerText和新增逻辑保持一致,不需要可删除 pathNode.InnerText = fileLocTxt.Text; settXML.Save("settings.xml"); } } } else { // 原有新增配置的逻辑保持不变即可 XmlElement setting = settXML.CreateElement("setting"); setting.SetAttribute("default", ""); XmlElement name = settXML.CreateElement("name"); setting.AppendChild(name); name.SetAttribute("content", nameTxt.Text); name.InnerText = nameTxt.Text; XmlElement path = settXML.CreateElement("path"); setting.AppendChild(path); path.SetAttribute("content", fileLocTxt.Text); path.InnerText = fileLocTxt.Text; XmlElement date = settXML.CreateElement("date"); setting.AppendChild(date); string dateVal = dateTimePicker1.Value.Date.ToString("MM - dd - yyyy"); date.SetAttribute("content", dateVal); date.InnerText = dateVal; settXML.DocumentElement.AppendChild(setting); settXML.Save("settings.xml"); consoleLog.AppendText("Saved " + "'" + nameTxt.Text + "'"); consoleLog.AppendText(Environment.NewLine); savesBox.Items.Add(nameTxt.Text); } }
优化建议
- 新增配置的逻辑里同时设置了元素的
content属性和InnerText,如果业务不需要InnerText可以删除,避免后续维护出现两边值不一致的问题。 - 构造XPath查询时建议对输入内容的特殊字符做转义,避免
nameTxt.Text包含单引号等字符时触发XPath语法错误。
内容的提问来源于stack exchange,提问作者DogFoxX
相关产品推荐
相关产品推荐

