>我在更新 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);