让我们假设你有一个包含settings.xml
文件的地方:
<?xml version="1.0" encoding="utf-8" ?>
<Settings>
<Section1>
<Key1>Value1</Key1>
<Key2>Value2</Key2>
</Section1>
<Section2>
<Key1>Value3</Key1>
<Key2>Value4</Key2>
<KeyX>Value5</KeyX>
</Section2>
</Settings>
然后你就可以有一个SettingsProvider
类是这样的:
using System.Xml.Linq;
public static class SettingsProvider
{
private const string settingsFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "settings.xml");
private static XDocument settings;
static SettingsProvider()
{
try
{
settings = XDocument.Load(settingsFileName);
}
catch
{
settings = XDocument.Parse("<Settings/>");
}
}
public static string GetValue(string section, string key, string defaultValue)
{
XElement settingElement = GetSettingElement(section, key);
return settingElement == null ? defaultValue : settingElement.Value;
}
public static void SetValue(string section, string key, string value)
{
XElement settingElement = GetSettingElement(section, key, true);
settingElement.Value = value;
settings.Save(settingsFileName);
}
private static XElement GetSettingElement(string section, string key, bool createIfNotExist = false)
{
XElement sectionElement =
settings
.Root
.Elements(section)
.FirstOrDefault();
if (sectionElement == null)
{
if (createIfNotExist)
{
sectionElement = new XElement(section);
settings.Root.Add(sectionElement);
}
else
{
return null;
}
}
XElement settingElement =
sectionElement
.Elements(key)
.FirstOrDefault();
if (settingElement == null)
{
if (createIfNotExist)
{
settingElement = new XElement(key);
sectionElement.Add(settingElement);
}
}
return settingElement;
}
public static void RemoveSetting(string section, string key)
{
XElement settingElement = GetSettingElement(section, key);
if (settingElement == null)
{
return;
}
XElement sectionElement = settingElement.Parent;
settingElement.Remove();
if (sectionElement.IsEmpty)
{
sectionElement.Remove();
}
settings.Save(settingsFileName);
}
}
您可以使用它像这样:
string section1Key1 = SettingsProvider.GetValue("Section1", "Key1", "default");
SettingsProvider.SetValue("Section1", "Key1", "OtherValue");
SettingsProvider.SetValue("Section1", "Key2", "Value2");
SettingsProvider.SetValue("Section2", "Key1", "Value3");
SettingsProvider.RemoveSetting("Section2", "Key1");
SettingsProvider.RemoveSetting("Section1", "Key2");
这很棒。我只修改路径以使其有效,并且如果文件不存在,还必须添加初始化方法以创建空根元素。查看我的修改建议。 Köszönömszépen;-) – ib11
接受您的修改建议。但将Initialize()方法替换为静态ctor以确保在使用'SettingsProvider'之前执行初始化。 Igazánnincs mit,énköszönöm。 :) – Gabor
好的,它首先被执行,因为'GetSettingElement'总是被首先调用,它首先有'Initialize()'方法调用。但这是更清洁的。我只做了一个更多的编辑,以删除不再需要的调用(并且因为您将方法更改为构造函数而无效)。 Ha tetszik akérdés,azt is felpontozhatod ;-)Köszimégegyszer,sokatsegített。 – ib11