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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:18:05