2016-04-24 31 views
2

我有一个应用程序,我从VB转换为C#在Visual Studio 2013和.NET不再支持PrivateProfileString,但希望我使用XML代替。Visual C#存储和读取自定义选项到Appdata中的自定义XML

我需要一个非常简单的代码的帮助,它可以存储和读取XML中的两个字符串setting1setting2并从中读取它。

我想知道什么是最有效的方法去做这件事。是否使用XMLDocumentXMLWriter

如果有人能给我一个简单的脚本,我会非常感激。谢谢!

回答

1

让我们假设你有一个包含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"); 
+1

这很棒。我只修改路径以使其有效,并且如果文件不存在,还必须添加初始化方法以创建空根元素。查看我的修改建议。 Köszönömszépen;-) – ib11

+1

接受您的修改建议。但将Initialize()方法替换为静态ctor以确保在使用'SettingsProvider'之前执行初始化。 Igazánnincs mit,énköszönöm。 :) – Gabor

+0

好的,它首先被执行,因为'GetSettingElement'总是被首先调用,它首先有'Initialize()'方法调用。但这是更清洁的。我只做了一个更多的编辑,以删除不再需要的调用(并且因为您将方法更改为构造函数而无效)。 Ha tetszik akérdés,azt is felpontozhatod ;-)Köszimégegyszer,sokatsegített。 – ib11