简体   繁体   English

我如何在C#中更新XML文件

[英]How can i update xml file in c#

I write console application program this is my xml file : 我编写console application程序,这是我的xml file

    <?xml version="1.0" encoding="utf-8" ?>
    <Settings>
      <AsteriskHost type="string">172.16.18.14</AsteriskHost>

</Settings>

I run this code 我运行这段代码

   public void Set(List<AcmSettings> acmSettings)
    {
        XElement xelement = XElement.Load("Settings.xml");
        IEnumerable<XElement> settings = xelement.Elements();
        foreach (var item in acmSettings)
        {
            settings.FirstOrDefault(x => x.Name == item.Name).SetValue("treeee");
        }
        xelement.Save("Settings.xml");
    }

this my test: 这是我的测试:

[Test]
public void SetShouldUpdateValue()
{
    var settingsManager = new SettingsManager();
    const string newIp = "165.166.167.167";
    const string elemntName = "AsteriskHost";
    var acmSetting = new List<AcmSettings> { new AcmSettings { Name = elemntName, Value = newIp } };
    settingsManager.Set(acmSetting);
    var setting = settingsManager.Get(x => x.Name == elemntName).FirstOrDefault();
    Assert.IsTrue(setting != null);
    Assert.IsTrue(setting.Value== newIp);

}

I don't have any error but my new value not save in file. 我没有任何错误,但是我的新值未保存在文件中。

How can I update xml node in c# 如何在C#中更新xml node

I tried your Set method, and it runs ok for me. 我尝试了您的Set方法,它对我来说运行正常。 I did have to tweak your current implementation by changing just one line: 我确实只需要更改一行就可以调整当前的实现:

// settings.FirstOrDefault(x => x.Name == item.Name).SetValue("treeee");
settings.FirstOrDefault(x => x.Name == item.Name).SetValue(item.Value);

Perhaps the problem is with your Get method. 也许问题出在您的Get方法上。 Here is a quick (not production quality) Get implementation. 这里是一个快速(不生产质量) Get落实。 Using this implementation, your unit test runs successfully. 使用此实现,您的单元测试将成功运行。

// note - just a string (name) passed in
public XElement Get(string name)
{
    XElement xelement = XElement.Load("Settings.xml");
    IEnumerable<XElement> settings = xelement.Elements();

    return settings.FirstOrDefault(x => x.Name == name);
}

The other possibility is that, as suggested in the comments above, is that you are looking at your project XML file, and not looking at the output XML file. 如以上注释中所建议,另一种可能性是您正在查看项目XML文件,而不是在查看输出XML文件。

Try like this 这样尝试

 XmlDocument xmlDom = new XmlDocument();
 xmlDom.Load("YourXMLFILEPATH.xml");
 XmlNode newXMLNode = xmlDom.SelectSingleNode("/Settings/AsteriskHost");
 newXMLNode.InnerText = YourValue;
 xmlDom.Save("YourXMLFILEPATH.xml");
 Console.WriteLine(xmlDom);

Have you tried this ? 你尝试过这个吗?

You can modify your set method like this. 您可以像这样修改您的设置方法。

    public void Set(List<AcmSettings> acmSettings)
    {
        XElement xelement = XElement.Load("Settings.xml");
        IEnumerable<XElement> settings = xelement.Elements();
        foreach (var item in acmSettings)
        {
            xelement.Descendants(item.Name).FirstOrDefault().Value = item.Value;
        }
        xelement.Save("Settings.xml");
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM