2010-12-01 86 views
1

我想確定加載某些配置設置的最佳方法。基本上,我有一個應用程序,幾個人將登錄,一旦他們已經登錄,我想加載他們所有的設置(例如:顏色,字體大小,個人記錄等)在.NET中解析XML文件

我是考慮使用XML文件來做這件事,因爲我認爲在.NET中解析會相當容易,但是我預計它似乎更困難。

<ProgramSettings> 
    <database file="C:\database.mdb" />  
</ProgramSettings> 

<UserSettings> 
    <user key="user1"> 
    <layout color="red" fontsize="5" /> 
    <data file="C:\test1.txt" /> 
    </user> 

    <user key="user2"> 
    <layout color="blue" fontsize="2" /> 
    <data file="C:\test2.txt" /> 
    </user> 

</UserSettings> 

注:出於某種原因,部分代碼沒有出現,但基本上有標有「ProgramSettings」和主要部分「UserSettings。」 編輯:謝謝誰修復了我。

無論如何,我想要做的是獲得「用戶密鑰」,這將是用戶的登錄名或什麼。那麼,能夠做到這樣的事情會很高興:

String userLogin = "user1"; 

// returns red 
String color = myXMLFile["UserSettings"][userLogin]["layout"]["color"];   

// returns 5 
String fontSize = myXMLFile["UserSettings"][userLogin]["layout"]["fontsize"]; 

這樣的事情是可能的嗎?我所做的所有研究似乎都表明你需要循環每個值。我想加載整個文件,並直接訪問任何元素。

這也將是冷靜,如果你可以編輯喜歡的值:

myXMLFile["UserSettings"][userLogin]["layout"]["fontsize"] = "green"; 

回答

1

我想用XML處理的文件在C#中的一個相當舒適的方式是使用LINQ to XML。

using (FileStream lStream = new FileStream("ConfigurationSettings.xml", FileMode.Open, FileAccess.Read)) 
{ 
    XElement lRoot = XElement.Load(lReader) 
    string userLogin = "user1"; 
    XElement user = lRoot.Element("UserSettings").Elements("user").Where(x => x.Attribute("Key").Value == userLogin).FirstOrDefault(); 
     if (user != null) 
     { 
      // returns red 
      string color = user.Element("layout").Attribute("color").Value; 

      // returns 5 
      string fontSize = user.Element("layout").Attribute("fontsize").Value; 
     } 

} 
5

我會建議你使用集成配置模型,這將需要從你所有的工作。您可以在設置下的項目設置中找到它。

它具有用戶級別(可更改)和應用級別(在代碼中不可更改),您可以通過projectnamespace.Properties.Settings訪問數據來使用數據。

msdn(該鏈接適用於visual studio 2005,但它也適用於其他任何版本)。

+0

感謝您的鏈接。我在搜索時看到類似的東西,但無法弄清楚它是如何工作的。這個鏈接是一個很好的教程。謝謝! – Eric 2010-12-01 17:00:09

0

查看System.Xml.XmlDocument類。特別是SelectSingleNode方法,它會給你一個XmlNode,它有一個你可以寫入的Value屬性。

1

我不會說這是一個理想的方法,我不記得確切語法頂部我的頭,但你可以使用System.Linq.Xml庫,它是.net 3.5的一部分。

你會先在你的XML文件中的所有負載這將是這樣的:

var xDoc = XDocument.Load("MyFile.xml"); 
var myElementValue = xDoc.Element("UserSettings") 
         .Element("userLogin") 
         .Element("layout") 
         .Element("fontsize") 
         .Value; 

我的語法可能不是100%正確的,真的是你應該做一些驗證,以確保您的節點都在那裏在你全部閱讀之前,但我認爲這應該做你想做的事情。你甚至可以做一個XPath只是直接到節點...類似:

var xmlResult = xDoc.XPathSelectElement("UserSettings/UserLogin/Layout/Fontsize").Value; 

查找該命名空間的更多信息,因爲這是據我知道的工作的新途徑與XML自.NET 3.5。

+0

優秀。非常感謝你! – Eric 2010-12-01 16:53:02

2

如果您使用的是.NET 3.5或更高版本,請查看XDocument

MSDN XDocument

你可以做你正在嘗試做的,因爲這:

XDocument Settings = new XDocument; 
Settings = XDocument.Load("XmlFilePath"); 

//This Section Gets the Program Settings 

XElement ProgramSettings = Settings.Element("ProgramSettings"); 
string DatabaseFile = ProgramSettings.Element("database").Attribute("file").Value.ToString(); 


//This section gets the logged in users Settings 

XElement UserSettings = Settings.Element("UserSettings"); 

//Get Node For current USer 

XElement CurrentUserSettings = UserSettings.Element(loggedInUserName); 
string UserColor = CurrentUserSettings.Element("Layout").Attribute("color").Value.ToString(); 
string USerFontSize = CurrentUserSettings.Element("Layout").Attribute("font").Value.ToString(); 
string dataFile = CurrentUserSettings.Element("data").Attribute("file").Value.ToString(); 

這應該爲你工作。

+0

這太棒了!非常感謝你爲我寫出來。 :) – Eric 2010-12-01 16:54:03

+0

@Eric如果它的作品選擇它作爲答案 – msarchet 2010-12-01 17:03:41