2010-12-01 9 views
1

いくつかの構成設定でロードする最良の方法を決定しようとしています。基本的に、私はいくつかの人がログインするアプリケーションを持っています。一度ログインすれば、すべての設定(たとえば、色、フォントサイズ、個人的なレコードなど)をロードします。.NETでのXMLファイルの解析

.NETで解析するのはかなり簡単だと思ったのでXMLファイルを使用することを考えましたが、私が予想していたより難しいようです。

<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

私はC#でXMLファイルを処理するかなり快適な方法は、XMLにLinqを使用していると思います。

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; 
     } 

} 
+0

絶対に素晴らしい!これはまさに私が欲しかったことであり、完璧に働いていますどうもありがとうございます! – Eric

5

私は統合された構成モデルを使用することができ助言するが、これはあなたからすべての作業がかかります。設定のプロジェクト設定で見つけることができます。

ユーザーレベル(変更可能)とアプリケーションレベル(コードは変更できません)の両方が必要な場合は、projectnamespace.Properties.Settingsでアクセスしてデータを使用できます。

msdn(リンクはビジュアルスタジオ2005用ですが、他のバージョンにも適用されます)。

+0

ありがとうございます。私が探していたときのようなものを見ましたが、それがどう働いているのか分かりませんでした。このリンクは素晴らしいチュートリアルです。ありがとう! – Eric

0

System.Xml.XmlDocumentクラスをご覧ください。具体的にはSelectSingleNodeメソッドです。このメソッドは、書き込むことができるValueプロパティを持つXmlNodeを提供します。

1

私はそれが理想的なアプローチであるとは言いませんが、の正確な意味はの文法を覚えていますが、.net 3.5の一部であるSystem.Linq.Xmlライブラリを使うことができます。

あなたはでしょう最初のようなものになるだろう、あなたのxmlファイル内のすべての負荷の:私の構文が100%正確でないかもしれないし、本当にあなたのノードがすべて存在していることを確認するために、いくつかの検証を行う必要があります

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

あなたがそれをすべて読む前に、私はあなたが望むことをするべきだと思う。あなたも...のようなものばかりノードに直接行くためにXPathを行うことができるかもしれません。詳細はそのネームスペースの

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

見て、これは私の知る限り仕事に新しい方法であるとして、 NET 3.5以降でXMLを使用する

+0

優れています。どうもありがとうございました! – Eric

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

+0

@エリックはそれが答えとしてそれを選択する – msarchet