在WPF C#中更新XML文档

时间:2017-03-28 16:14:33

标签: c# xml

我在更新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;服务器。

抱歉,我没有预料到这一点,并试图让这个例子尽可能简单。

4 个答案:

答案 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)

enter image description here

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