Nehmen wir an, Sie haben eine settings.xml
Datei irgendwo das enthält:
<?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>
Dann können Sie eine SettingsProvider
Klasse wie folgt:
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);
}
}
Sie können es wie folgt verwenden:
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");
Das war ausgezeichnet. Ich habe nur den Pfad geändert, um ihn gültig zu machen, und musste auch eine Initialisierungsmethode hinzufügen, um das leere Wurzelelement zu erstellen, wenn die Datei nicht existiert. Siehe meinen Bearbeitungsvorschlag. Köszönöm szépen ;-) – ib11
Akzeptiert Ihren Bearbeitungsvorschlag. Aber ersetzte die Methode Initialize() zu statischem ctor, um sicherzustellen, dass die Initialisierung vor der Verwendung von 'SettingsProvider' ausgeführt wird. Igazán nincs mit, ön köszönöm. :) – Gabor
OK, es wurde sowieso zuerst ausgeführt, weil das 'GetSettingElement' immer zuerst aufgerufen wird, welches zuerst den 'Initialize()' Methodenaufruf hatte. Aber das ist sauberer. Ich habe nur eine weitere Bearbeitung durchgeführt, um den Aufruf, der nicht mehr benötigt wird, zu entfernen (und ist nicht gültig, da Sie die Methode in einen Konstruktor geändert haben). Ha tetszik a kérdés, azt ist fappontozhatod ;-) Köszi még egyszer, sokat segített. – ib11