在 WPF C# 中更新 XML 文档



>我在更新 XML 文档时遇到问题。

<?xml version="1.0" encoding="utf-16"?>
<test>
<settings server="1" />
</test>

例如,我想更新"1"。

我试过这样:

XmlDocument doc = new XmlDocument();
doc.Load(path);
doc.SelectSingleNode("test/settings/server").InnerText = "2"
doc.Save(path);

我认为这应该很容易解决,但我真的是个笨蛋。

更新:

我已经尝试了您的解决方案,它们适用于给定的示例。 谢谢大家!

但是在给定的XML中,有一个奇怪的结构,我遇到了以下问题:

<?xml version="1.0" encoding="utf-16"?>
<test>
<settings server="1" />
<settings config="999" />
</test>

使用这种结构,您的解决方案都不起作用,如果我尝试更改配置的"999",我总是得到"System.NullReferenceException"。

我只能访问服务器的"1"。

抱歉,我没想到会这样,并试图使示例尽可能简单。

你可以用

var path = @"C:usersbassiedesktoptest.xml";
var doc = new XmlDocument();
doc.Load(path);
var settings = doc.SelectSingleNode("test/settings");
settings.Attributes["server"].Value = "2";
doc.Save(path);

如果要将settings更新为以下内容,将使用InnerText

<settings server="1"> 2 </settings>

您尝试更新settings元素的属性的位置。


关于您的更新,您可以将doc.SelectSingleNode替换为如下所示的doc.SelectNodes

var settings = doc.SelectNodes("test/settings");

这将选择test下的所有可用settings元素。

然后在设置属性时,您只需提供要定位的元素的索引,例如:

settings[0].Attributes["server"].Value = "2";

更新server的值,或

settings[1].Attributes["config"].Value = "000";

以更新config的值。


然而

我认为您在这里最好的方法是使用System.Xml.Linq,以便您可以按属性名称选择正确的settings元素:

var document = XDocument.Load(path);
var attributeName = "server";
var element = document.Descendants("settings")
.FirstOrDefault(el => el.Attribute(attributeName) != null);

该代码获取文档中的所有settings元素(Descendants),然后选择attributeName(在本例中为"服务器")未null的第一个元素。

这当然依赖于每个属性只出现一次的事实(即你不能有多个带有"server"属性的settings元素),因为它使用FirstOrDefault选择器意味着它只会返回 1 个元素。

希望这有帮助

服务器是一个属性

var doc = new XmlDocument();
doc.Load(path);
doc.SelectSingleNode("test/settings").Attributes["server"].Value = "2"
doc.Save(path);

试试这个:

XmlDocument doc = new XmlDocument(); 
doc.Load(path); 
XmlNode root = doc.DocumentElement; 
XmlNode myNode = root.SelectSingleNode("test/settings"); 
myNode.Attributes["server"].Value = "2";
doc.Save(path);

或 LINQ to XML

var document = XDocument.Load(path);
document.Descendants("settings").First().Attribute("server").Value = "2";
document.Save(path);