我在更新XML文档时遇到了问题。
<?xml version="1.0" encoding="utf-16"?>
<test>
<settings server="1" />
</test>
例如,我想更新&#34; 1&#34;。
我试过这样:
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>
使用这种结构,你的解决方案都不起作用,我总是得到一个&#34; System.NullReferenceException&#34;如果我试图改变&#39; 999&#39;配置。
我只能访问&#39; 1&#39;服务器。
抱歉,我没有预料到这一点,并试图让这个例子尽可能简单。
答案 0 :(得分:0)
您可以使用
执行此操作var path = @"C:\users\bassie\desktop\test.xml";
var doc = new XmlDocument();
doc.Load(path);
var settings = doc.SelectSingleNode("test/settings");
settings.Attributes["server"].Value = "2";
doc.Save(path);
如果您想要将InnerText
更新为以下内容,则会使用 settings
:
<settings server="1"> 2 </settings>
您尝试更新settings
元素的属性的位置。
关于您的更新,您可以将doc.SelectSingleNode
替换为doc.SelectNodes
,如下所示:
var settings = doc.SelectNodes("test/settings");
这将选择settings
下的所有可用test
元素。
然后在设置属性时,您只需提供要定位的元素的索引,例如:
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
(本例中为“服务器”)不是{{1 }}。
这当然依赖于这样一个事实:每个属性只出现一次(即你不能拥有带有“server”属性的多个null
元素),因为它使用settings
选择器意味着它只返回1个元素。
希望这有帮助
答案 1 :(得分:0)
服务器是一个属性
var doc = new XmlDocument();
doc.Load(path);
doc.SelectSingleNode("test/settings").Attributes["server"].Value = "2"
doc.Save(path);
答案 2 :(得分:0)
试试这个:
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);
答案 3 :(得分:0)