2010-12-01 14 views
1

Ich versuche, in einigen Konfigurationseinstellungen den besten Weg zu laden. Im Grunde habe ich eine Anwendung, in die sich mehrere Leute einloggen, und nachdem sie sich angemeldet haben, möchte ich alle ihre Einstellungen laden (zum Beispiel: Farben, Schriftgrößen, persönliche Aufzeichnungen, etc.)Analysieren von XML-Dateien in .NET

Ich war Ich dachte daran, eine XML-Datei zu verwenden, weil ich dachte, dass es ziemlich einfach wäre, in .NET zu parsen, aber es scheint schwieriger zu sein, als ich es erwartet hatte.

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

Hinweis: Aus irgendeinem Grund ein Teil des Codes wird nicht angezeigt, aber im Grunde gibt es große Abschnitte mit der Bezeichnung „ProgramSettings“ und „Usersettings.“ Edit: Danke wer auch immer das für mich behoben.

Wie auch immer, was ich tun möchte ist, den "Benutzerschlüssel" zu erhalten, der der Benutzername des Benutzers oder etwas sein wird. Dann wäre es schön, etwas in der Art zu tun zu können:

String userLogin = "user1"; 

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

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

Ist so etwas möglich? Alle Untersuchungen, die ich durchgeführt habe, scheinen darauf hinzuweisen, dass Sie jeden Wert durchlaufen müssen. Ich möchte die ganze Datei laden und auf jedes Element direkt zugreifen.

Es wäre auch cool, wenn Sie die Werte wie bearbeiten können:

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

Antwort

1

Ich denke, eine ziemlich bequeme Art des Umgangs mit XML-Dateien in C# verwendet Linq zu 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; 
     } 

} 
+0

Absolut fantastisch! Genau das wollte und funktionierte ich perfekt. Ich danke dir sehr! – Eric

5

Ich würde Ihnen raten, den integrierten Konfigurationsmodell zu verwenden, das von Ihnen die ganze Arbeit zu nehmen. Sie finden es in den Projekteinstellungen unter Einstellungen.

Es hat sowohl Benutzerebene (änderbar) als auch Anwendungsebene (nicht änderbar im Code) wie Sie wollen, Sie können die Daten verwenden, indem Sie über projectnamespace.Properties.Settings darauf zugreifen.

msdn (der Link ist für Visual Studio 2005, gilt aber auch für weitere Versionen).

+0

Danke für den Link. Ich habe so etwas gesehen, als ich gesucht habe, aber ich konnte nicht herausfinden, wie es funktioniert hat. Dieser Link ist ein großartiges Tutorial. Vielen Dank! – Eric

0

Werfen Sie einen Blick auf die System.Xml.XmlDocument Klasse. Insbesondere die SelectSingleNode-Methode, die Ihnen einen XmlNode mit einer Value-Eigenschaft liefert, in die Sie schreiben können.

1

Ich würde nicht sagen, es ist ein idealer Ansatz und ich kann nicht erinnern, die genaue Syntax von oben auf meinen Kopf, aber Sie können die System.Linq.Xml-Bibliothek verwenden, die Teil von .net 3.5 ist.

Sie würden in erster Linie Last in der XML-Datei, die wie etwas sein würde:

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

Meine Syntax kann nicht 100% richtig sein und wirklich sollten Sie einige Validierung tun, um sicherzustellen, dass Ihre Knoten sind alle da bevor du alles gelesen hast, aber ich denke das sollte tun was du willst. Sie können sogar in der Lage sein, einen XPath zu tun, nur mit dem Knoten direkt zu gehen ... so etwas wie:

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

Geben Sie für diesen Namespace für weitere Informationen, da dies so weit ist, wie ich die neue Art und Weise kennen zu arbeiten mit XML seit .net 3.5.

+0

Ausgezeichnet. Vielen Dank! – Eric

2

Werfen Sie einen Blick auf XDocument, wenn Sie .NET 3.5 oder höher verwenden.

MSDN XDocument

Sie können tun, was Sie versuchen, wie dies zu tun:

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

Das sollte für Sie arbeiten.

+0

Das ist großartig! Vielen Dank für das Schreiben für mich. :) – Eric

+0

@Eric, wenn es funktioniert, wählen Sie es als Antwort – msarchet