2016-04-24 7 views
2

Visual Studio 2013でVBからC#に変換するアプリケーションがありますが、.NETはもはやPrivateProfileStringをサポートしませんが、代わりにXMLを使用したいと考えています。Visual C#AppdataのカスタムXMLへのカスタムオプションの格納と読み取り

2つの文字列setting1setting2をXMLに格納して読み取ってから読み取ることができる非常に簡単なコードの助けが必要です。

私はこのことについて最も効果的な方法が何であるか知りたいと思います。 XMLDocumentまたはXMLWriterを使用していますか?

誰かが私に簡単なスクリプトを与えることができたら、本当に感謝します。ありがとう!

答えて

1

のは、あなたが含まれているsettings.xmlファイルのどこかに持っていると仮定しましょう:

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

<?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クラスを持つことができますが

+1

これは優れていました。私はそれを有効にするためだけにパスを変更し、ファイルが存在しない場合は空のルート要素を作成するための初期化メソッドを追加しなければなりませんでした。私の編集提案を参照してください。 Köszönömszépen;-) – ib11

+1

編集提案を受け入れました。しかし、Initialize()メソッドを静的ctorに置き換えて、 'SettingsProvider'を使用する前に初期化を実行するようにしました。 Igazánnincs mit、énköszönöm。 :) – Gabor

+0

'GetSettingElement'が常に最初に呼び出され、最初に' Initialize() 'メソッド呼び出しがあったので、これは最初に実行されました。しかし、これはよりクリーンです。私はもうもう一回編集して、もはや必要ではない呼び出しを削除しました。そして、メソッドをコンストラクタに変更してから有効ではありません。ハット・テッツィーク・ア・ケデーズ、アズ・トゥ・フェルフォンツァードド;-)ケツィエ・メイ・エイサー、ソケ・セグイテット。 – ib11

関連する問題