ib11
ib11

Reputation: 2568

Visual C# storing and reading custom options to and from a custom XML in Appdata

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

Answers (1)

Gabor
Gabor

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

Related Questions