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

不使用Linq更新XML文件:节点获取为空及空引用异常求助

嘿,我来帮你找找问题出在哪——你忽略了几个容易踩的XML操作小坑,咱们一个个捋清楚:

第一个代码:节点n为空的原因
  • 文件名拼写错误:你写的是doc.Load("/path/to/sutdents.xml");,但你的XML文件名应该是students.xml(注意是students不是sutdents,少了一个t)。加载错误的文件会导致整个文档为空,后续的XPath查询自然找不到任何节点。
  • (额外提醒)如果student.name包含单引号,直接拼接XPath字符串会导致语法错误,不过当前场景下Adam没问题,只是个潜在风险。
第二个代码:空引用异常的原因
  • 空白文本节点的干扰:当XML节点之间有空格、换行时,XmlDocument会把这些空白解析成文本节点。比如你的<student>节点下,第一个子节点很可能不是<name>,而是空白文本节点,这时候node.FirstChild.InnerText拿到的是空白字符串,根本匹配不上student.name。如果循环到某个节点时node.SelectSingleNode("age")返回null,直接赋值InnerText就会触发空引用异常。
  • 同样存在文件名拼写错误,这会导致nodes为空,遍历逻辑也会出问题。
修正后的代码示例

先把文件名的拼写改对,再调整查询逻辑:

方法1:修正XPath查询

XmlDocument doc = new XmlDocument();
// 修正文件名拼写
doc.Load("/path/to/students.xml");
// 直接通过name节点的文本定位目标学生
XmlNode studentNode = doc.SelectSingleNode("/students/student[name='" + student.name + "']");
if (studentNode != null)
{
    XmlNode ageNode = studentNode.SelectSingleNode("age");
    if (ageNode != null) // 额外检查避免空引用
    {
        ageNode.InnerText = new_value;
    }
    doc.Save("/path/to/students.xml"); // 别忘了保存修改!
}

方法2:修正遍历逻辑

XmlDocument doc = new XmlDocument();
doc.Load("/path/to/students.xml");
XmlNodeList nodes = doc.SelectNodes("/students/student");
foreach (XmlNode node in nodes)
{
    // 直接定位name节点,跳过空白文本节点的干扰
    XmlNode nameNode = node.SelectSingleNode("name");
    if (nameNode != null && nameNode.InnerText == student.name)
    {
        XmlNode ageNode = node.SelectSingleNode("age");
        if (ageNode != null)
        {
            ageNode.InnerText = new_value;
        }
        break; // 找到目标后退出循环,提升效率
    }
}
doc.Save("/path/to/students.xml"); // 必须保存才会生效
额外推荐:用LINQ to XML更省心

如果你可以使用.NET 3.5及以上版本,推荐用XDocument(LINQ to XML),它的API更简洁,几乎不会受空白节点的影响:

XDocument doc = XDocument.Load("/path/to/students.xml");
var targetStudent = doc.Descendants("student")
                       .FirstOrDefault(s => s.Element("name")?.Value == student.name);
if (targetStudent != null)
{
    targetStudent.Element("age").Value = new_value;
    doc.Save("/path/to/students.xml");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:24:37