Parsing XML Files in .NET

…衆ロ難τιáo~ 提交于 2019-12-05 03:44:35

问题


I'm trying to decide on the best way to load in some configuration settings. Basically, I have an application that several people will log into, and once they've logged in, I want to load all of their settings (for example: colors, font sizes, personal records, etc.)

I was thinking of using an XML file to do this because I thought it would be fairly easy to parse in .NET, but it seems to be more difficult that I anticipated.

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

Note: For some reason some of the code is not appearing, but basically there are major sections labeled "ProgramSettings" and "UserSettings." Edit: Thanks whoever fixed that for me.

Anyway, what I would like to do is get the "user key" which will be the user's login name or something. Then, it would be nice to be able to do something like this:

String userLogin = "user1";

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

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

Is anything like this possible? All the research I've done seems to indicate that you need to loop through each value. I'd like to load the whole file, and access any element directly.

It would also be cool if you could edit the values like:

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

回答1:


I think a fairly comfortable way of dealing with XML files in C# is using 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;
      }

}



回答2:


I would advise you to use the integrated configuration model, this will take all the work from you. You can find it in the projects settings under settings.

It has both user level (changeable) and application level (not changeable in code) as you want, you can use the data by accessing it via projectnamespace.Properties.Settings.

msdn (the link is for visual studio 2005, it applies for any further versions as well though).




回答3:


Take a Look at XDocument if you are using .NET 3.5 or higher.

MSDN XDocument

You could do what you are trying to do as this:

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

That should work for you.




回答4:


I wouldnt say its an ideal approach and i cant remember the exact syntax off top of my head but you can use the System.Linq.Xml library, which is part of .net 3.5.

You would first of all load in your xml file which would be something like:

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

My syntax may not be 100% correct and really you should do some validation to make sure your nodes are all there before you read it all out, but I think that should do what you want. You may even be able to do an XPath to just go directly to the node... something like:

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

Look for that namespace for more info, as this is as far as i know the new way to work with XML since .net 3.5.




回答5:


Have a look at the System.Xml.XmlDocument class. Specifically the SelectSingleNode method, which will give you an XmlNode which has a Value property that you can write to.



来源:https://stackoverflow.com/questions/4326399/parsing-xml-files-in-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!