对配置文件 xml 进行操作

个人喜欢用 Linq 的方式来进行操作,方便快捷

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="LargePrintName" value="Zebra ZT410R (203 dpi)"/>
    <add key="SmallPrintName" value="Zebra ZT410R (203 dpi) #2"/>
    <add key="UrlPrefix" value="http://101.201.153.239:8071/api/"/>
    <add key="PageSize" value="10"/>
    <add key="LabelFormatRootDirectory" value="LabelFormat"/> 
    <add key="LabelPrintTimeout" value="60"/>
  </appSettings>
 </configuration>
XElement xe = XElement.Load("RfidPrint.exe.config");//加载XML文件,获取其内容

XElement largeElement = (from ele in xe.Element("appSettings").Elements()
                                     where ele.Attribute("key").Value == largePrintName
                                     select ele).SingleOrDefault();
//获取 appSettings 节点下的所有子节点,找到子节点的属性 key 值为 largePrintName的,获取此节点

            if (largeElement != null)
            {
                largeElement.Attribute("value").Value = txtLargePrinterName.Text;
                xe.Save("RfidPrint.exe.config");
            }
//将此节点的value属性改成 txtLargePrinterName.Text 保存即可

一开始我是想着是通过以下方式,直接获取我所要的add节点,开始操作,但是却无法实现,有些问题

XElement largeElement = (from ele in xe.Element("add")
                                     where ele.Attribute("key").Value == largePrintName
                                     select ele).SingleOrDefault();
//xe.Element("add") 获取的根本不是元素集合,只是单个对象,因此有问题

然后我想 直接获取 add 节点的集合,结果还是不起作用

XElement largeElement = (from ele in xe.Elements("add")
                                     where ele.Attribute("key").Value == largePrintName
                                     select ele).SingleOrDefault();
//问题在于其实 Elements 不是这么直接使用的,其实它是XElement对象的方法
//按照 XElement.Elements(节点名称) 这种方式来试用,如下

思路应该是:首先获取一个父节点 xe.Element("appSettings") 然后获取父节点下的节点 add Elements("add") 然后再根据节点值,属性获取自己想要的节点进行一系列操作

XElement largeElement = (from ele in xe.Element("appSettings").Elements("add")
                                     where ele.Attribute("key").Value == largePrintName
                                     select ele).SingleOrDefault();

 if (largeElement != null)
            {`
                largeElement.Attribute("value").Value = txtLargePrinterName.Text;
                xe.Save("RfidPrint.exe.config");
            }

[参考资料](https://www.cnblogs.com/wujy/p/3366812.html)

注意点:我们对配置文件进行修改的话,程序必须重新启动一次才会生效,有的时候想避免这种情况,可以不用在配置文件中配置,而是另起一个 XML 文件进行配置,如此可以不用重启程序

原文地址:https://www.cnblogs.com/wang-min/p/10334826.html