2016-04-24 12 views
2

Ich habe eine Anwendung, die ich von VB zu C# in Visual Studio 2013 und .NET nicht mehr unterstützt PrivateProfileString aber möchte ich stattdessen XML verwenden.Visual C# Speichern und Lesen von benutzerdefinierten Optionen zu und von einem benutzerdefinierten XML in Appdata

Ich brauche Hilfe von einem sehr einfachen Code, der zwei Strings setting1 und setting2 in einem XML speichern und lesen kann und es von ihm zurücklesen kann.

Ich würde gerne wissen, was der effektivste Weg ist, um darüber zu gehen. Ist es mit XMLDocument oder und XMLWriter?

Wenn jemand mir ein einfaches Skript geben könnte, würde ich es wirklich schätzen. Vielen Dank!

Antwort

1

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"); 
+1

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

+1

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

+0

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