无法修改XmlDocument值?XML文件修改后未生效问题排查
无法修改XML文件中的节点值,读取正常但保存后无变化?
我写了一个用于修改并读取XML值的简单函数,代码如下:
void ParseXml(string XmlFile) { string totalval = ""; XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(new StringReader(XmlFile)); string xmlPathPattern = "//name"; XmlNodeList mynodelist = xmldoc.SelectNodes(xmlPathPattern); foreach (XmlNode node in mynodelist) { XmlNode name = node.FirstChild; name.Value = "asd";//此处尝试修改值 totalval = totalval + "Name=" + name.OuterXml + "\n"; } xmldoc.Save(XmlFile); print(totalval); }
我的XML文件内容为:<name>John</name>。我能成功读取值,但无法修改XML文件中的值,运行程序后XML应变为<name>asd</name>,请问问题出在哪里?
问题根源
你这里的核心错误是加载XML的方式完全错了!XmlFile参数是文件路径字符串,但你用StringReader去加载它——这相当于把文件路径本身当成了XML内容来解析,而不是去读取对应路径下的实际XML文件。
举个例子,如果你的XmlFile是"C:/test.xml",那StringReader会把这个路径字符串当作XML内容,此时你的XmlDocument里的内容根本不是<name>John</name>,而是C:/test.xml(这甚至不是合法的XML)。后续你修改的是这个错误的文档,最后Save(XmlFile)只是把这个错误的内容覆盖回原文件,自然看不到你想要的修改效果。
修复方案
直接用XmlDocument.Load(string filename)方法加载文件,而不是绕个弯用StringReader。另外,修改节点值的时候用InnerText会比取FirstChild更可靠(避免节点包含空白子节点的情况)。
修改后的完整代码:
void ParseXml(string XmlFile) { string totalval = ""; XmlDocument xmldoc = new XmlDocument(); // 直接加载指定路径的XML文件 xmldoc.Load(XmlFile); string xmlPathPattern = "//name"; XmlNodeList mynodelist = xmldoc.SelectNodes(xmlPathPattern); foreach (XmlNode node in mynodelist) { // 直接设置节点的InnerText,简洁又可靠 node.InnerText = "asd"; totalval = totalval + "Name=" + node.OuterXml + "\n"; } // 保存修改后的内容回原文件 xmldoc.Save(XmlFile); print(totalval); }
这样修改后,程序会正确读取目标XML文件的内容,修改<name>节点的值,然后把修改后的内容写回原文件,你就能看到XML变成<name>asd</name>了。
内容的提问来源于stack exchange,提问作者Asssaa HJiok
相关产品推荐
相关产品推荐

