2012-07-13 98 views
0

我目前使用adhoc xml文件來保存配置設置,它正在工作,但它不是它需要的地方。配置文件設置 - 需要輸入

它是這樣的:

<XmlDoc> 

    <DefaultSettings> 
     <ExitProgramMessage>Y</ExitProgramMessage> 
    <DefaultSettings> 

    <Company> 
     <ExitProgramMessage>N</ExitProgramMessage> 
    <Company> 

    <Workstation> 
     <ExitProgramMessage>N</ExitProgramMessage> 
    </Workstation> 

    <User> 
     <ExitProgramMessage>Y</ExitProgramMessage> 
    <User> 

<XmlDoc> 

代碼編寫的方式是DefaultSettings先讀,然後公司(其覆蓋DefaultSettings),那麼工作站設置(覆蓋DefaultSettings或公司設置),然後工作站,然後用戶...上次閱讀勝,除了空白。他們不清理田地。在上面的例子中,ExitProgramMessage最終會是Y.

我遇到了幾個問題。

  1. 我不能輕易地添加更多的級別,因爲他們是硬編碼
  2. 我必須手動讀取每個節點,因爲它不是標準的XML格式,這意味着該文件需要手動編輯,它總是會引起問題。

這只是不容易使用,絕對不直觀。

所以,這就是說,我應該如何實現這一點,我可以創建一個屏幕來更新設置?

xml是正確的路要走嗎?我應該採用不同的路線嗎?我們沒有數據庫選項,只有平面文件。

此外,這些設置駐留在網絡用戶訪問共享驅動器的服務器上。所以,這些不能是保存在註冊表中的設置或者特定於用戶的任何設置。

任何想法將不勝感激。

謝謝!

回答

0

輕鬆處理幾個類。一個例子:

要讀取值:

Settings settings = new Settings(file); 
var company = settings["Company"].ExitProgramMessage; 

要寫入的值:

using(Settings settings = new Settings(file)) 
{ 
    settings["Workstation"].ExitProgramMessage = "Y"; 
} 

的類如下:

public class Settings : IDisposable 
{ 
    XElement self; 
    FileInfo file; 
    public Settings(FileInfo file) 
    { 
     if (file.Exists) 
      self = XElement.Load(file.FullName); 
     else 
      self = new XElement("XmlDoc"); 
     this.file = file; 
    } 

    public Setting this[string name] 
    { 
     get 
     { 
      XElement x = self.Element(name); 
      if (null == x) 
       self.Add(x = new XElement(name)); 
      return new Setting(x, name); 
     } 
    } 

    public void Dispose() 
    { 
     self.Save(file.FullName); 
    } 
} 

public class Setting 
{ 
    XElement self; 
    string name; 
    public Setting(XElement xsetting, string name) 
    { 
     self = xsetting; 
     this.name = name; 
    } 

    public string ExitProgramMessage 
    { 
     get 
     { 
      XElement x = self.Element("ExitProgramMessage"); 
      if (null == x) 
       return "Unknown"; // default value? 
      return (string)x; 
     } 
     set 
     { 
      XElement x = self.Element("ExitProgramMessage"); 
      if (null == x) 
       self.Add(new XElement("ExitProgramMessage", value)); 
      else 
       x.Value = value; 
     } 
    } 

    public string Name { get { return name; } } 
}