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

