Reputation: 2568
I have an app that I am converting from VB to C# in Visual Studio 2013 and .NET does not anymore support PrivateProfileString
but wants me to use XML instead.
I need help of a very simple code that can store and read two strings setting1
and setting2
in an XML and read it back from it.
I would like to know what is the most effective way of going about this. Is it with using XMLDocument
or and XMLWriter
?
If somebody could give me a simple script, I would really appreciate it. Thanks!
Upvotes: 2
Views: 121
Reputation: 3246
Let's assume you have a settings.xml
file somewhere that contains:
<?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>
Then you can have a SettingsProvider
class like this:
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);
}
}
You can use it like this:
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");
Upvotes: 1