【问题标题】:Parsing XML Files in .NET在 .NET 中解析 XML 文件
【发布时间】:2011-05-18 14:30:43
【问题描述】:

我正在尝试确定加载某些配置设置的最佳方式。基本上,我有一个应用程序可供多人登录,一旦他们登录,我想加载他们的所有设置(例如:颜色、字体大小、个人记录等)

我正在考虑使用 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>

注意:由于某些原因,一些代码没有出现,但基本上有主要部分标记为“程序设置”和“用户设置”。 编辑:感谢为我解决这个问题的人。

无论如何,我想做的是获取“用户密钥”,它将是用户的登录名或其他内容。那么,如果能做这样的事情就好了:

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

【问题讨论】:

    标签: c# .net xml parsing writing


    【解决方案1】:

    我建议您使用集成配置模型,这将承担您的所有工作。您可以在设置下的项目设置中找到它。

    它有你想要的用户级别(可更改)和应用程序级别(代码中不可更改),您可以通过projectnamespace.Properties.Settings访问它来使用数据。

    msdn(该链接适用于 Visual Studio 2005,但它也适用于任何其他版本)。

    【讨论】:

    • 感谢您的链接。我在搜索时看到了类似的东西,但无法弄清楚它是如何工作的。这个链接是一个很棒的教程。谢谢!
    【解决方案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();
    

    这应该适合你。

    【讨论】:

    • 这太棒了!非常感谢你为我写了这些。 :)
    【解决方案3】:

    我认为在 C# 中处理 XML 文件的一种相当舒适的方法是使用 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;
          }
    
    }
    

    【讨论】:

    • 太棒了!这正是我想要的并且完美地工作。非常感谢!
    【解决方案4】:

    我不会说它是一种理想的方法,而且我不记得 exact 语法,但您可以使用 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;
    

    查找该命名空间以获取更多信息,因为据我所知,这是自 .net 3.5 以来使用 XML 的新方法。

    【讨论】:

    • 优秀。非常感谢!
    【解决方案5】:

    看看System.Xml.XmlDocument 类。特别是 SelectSingleNode 方法,它将为您提供一个 XmlNode,该 XmlNode 具有您可以写入的 Value 属性。

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 2017-12-22
      • 2016-11-17
      • 2011-03-06
      • 2013-07-17
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多