我需要对web.config进行更改,所以我需要阅读,直到我需要进行更改,进行更改然后将更新写入文件。
所以,让我们说文件包含:
<add key="Version_PSM" value="2.2.0"/>
<add key="Version_MLF" value="2.0.3"/>
我需要更新版本pf Version_PSM到&#34; 2.1&#34;。最好的方法是什么?我尝试打开FileStream,然后使用它创建StreamReader和StreamWriter,但这并不起作用。当我从文件中读取要查找密钥的行时,我想要更新Writer保持在文件开头的位置,所以当我写它时不会覆盖我刚读过的内容 - 它会写入它到文件的顶部。所以首先我尝试了这样的事情:
// Repeat in a loop until I find what I'm looking for...
string readLine = sr.ReadLine();
sw.WriteLine(readline);
提升了作者的地位,但重复了文件中的内容。我需要定位编写器来覆盖我想要更新的文本,并将其他所有内容保留原样。
所以我尝试了:
readLine = sr.ReadLine();
sw.WriteLine();
但这只是将空白写入文件。
我必须在这里轻松回答,我才会失踪!
答案 0 :(得分:2)
由于您需要在安装期间更改值,因此可以使用LINQ to XML来解决问题(using System.Xml.Linq;
)。通常, web.config 文件类似于
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings>
<add key="Version_PSM" value="2.2.0" />
<add key="Version_MLF" value="2.0.3" />
</appSettings>
</configuration>
您可以根据节点的名称和属性访问和编辑节点。更改某些值后,您可以保存更改。在以下示例中,我们将更改 Version_PSM 设置的值。正如您所看到的,在这种情况下正确处理命名空间是一个小技巧。
//Specify path
string webConfigFile = @"\web.config";
//Load the document and get the default configuration namespace
XDocument doc = XDocument.Load(webConfigFile);
XNamespace netConfigNamespace = doc.Root.GetDefaultNamespace();
//Get and edit the settings
IEnumerable<XElement> settings = doc.Descendants(netConfigNamespace + "appSettings").Elements();
XElement versionPsmNode = settings.FirstOrDefault(a => a.Attribute("key").Value == "Version_PSM");
versionPsmNode?.Attribute("value").SetValue("New value");
//Save the document with the correct namespace
doc.Root.Name = netConfigNamespace + doc.Root.Name.LocalName;
doc.Save(webConfigFile);