【问题标题】:C# Parsing simple XML file with LINQC# 使用 LINQ 解析简单的 XML 文件
【发布时间】:2014-02-21 16:44:45
【问题描述】:

我有这个非常简单的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ConfigurationFile>
    <ConfigurationFilePath>Test1</ConfigurationFilePath>
    <ConnectionString>Test2</ConnectionString>
    <AnalyzeFilePath>Test3</AnalyzeFilePath>
</ConfigurationFile>

我想获取每个字段的信息。 但这并没有显示任何东西..

这是我的 C# 代码:

private void ParseXMLFile()
{
    Console.WriteLine("Parse");
    if (configurationPAthFileTextbox.Text != null)
    {
        Console.WriteLine("file != null");
        try
        {
            XElement main = XElement.Load(configurationPAthFileTextbox.Text);

            var results = main.Descendants("ConfigurationFile")
                          .Select(e => new { ConfigurationFilePath = e.Descendants("ConfigurationFilePath").FirstOrDefault().Value,
                                   ConnectionString = e.Descendants("ConnectionString").FirstOrDefault().Value });

            foreach (var result in results)
                Console.WriteLine("{0}, {1}", result.ConfigurationFilePath, result.ConnectionString);
            Console.ReadLine();

        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }
    }
}

【问题讨论】:

    标签: c# xml wpf linq linq-to-xml


    【解决方案1】:
    1. 将其加载为XDocument,因为它是一个文档,而不是一个元素。

      var xDoc = XDocument.Load(configurationPAthFileTextbox.Text);
      
    2. 您可以轻松地将您的文档转换为Dictionary&lt;string, string&gt;,其中元素名称作为键,元素值作为值:

      var results = xDoc.Root
                        .Elements()
                        .ToDictionary(e => e.Name, e => (string)e);
      
    3. 打印ConfigurationFilePathConnectionString

      Console.WriteLine("{0}, {1}", results["ConfigurationFilePath"], results["ConnectionString"]);
      

      打印Test1, Test2

    【讨论】:

      【解决方案2】:

      首先,创建一个类来表示您的 XML 文件中包含的感兴趣的信息。定义一个构造函数,从您的 XML 文件中提取感兴趣的值并将它们映射到您的类的属性:

      public class ConfigurationFile
      {
          public String ConfigurationFilePath { get; set; }
          public String ConnectionString { get; set; }
          public String AnalyzeFilePath { get; set; }
      
          public ConfigurationFile(String xmlFilePath)
          {
              XDocument document = XDocument.Load(xmlFilePath);
              var root = document.Root;
      
              ConfigurationFilePath = (string)root.Element("ConfigurationFilePath");
              ConnectionString = (string)root.Element("ConnectionString");
              AnalyzeFilePath = (string)root.Element("AnalyzeFilePath");
          }
      }
      

      一旦你用它的特殊构造函数创建了这个类,使用这个类就非常简单了:

      var configFile = new ConfigurationFile(xmlFilePath);
      
      var path = configFile.ConfigurationFilePath;
      var connectString = configFile.ConnectionString;
      var analyzeFilePath = configFile.AnalyzeFilePath;
      

      这是一个将所有内容组合在一起的演示程序。 (请注意,在此演示程序中,构造函数从字符串而不是从文件加载 XML,如上所示。)

      using System;
      using System.Xml;
      using System.Xml.Linq;
      
      class LinqToXmlDemo
      {
          static public void Main(string[] args)
          {
              string xmlContent = GetXml();
              var configFile = new ConfigurationFile(xmlContent);
      
              Console.WriteLine
                  ("ConfigurationFilePath:[{0}]\n" +
                   "ConnectionString:[{1}]\n" +
                   "AnalyzeFilePath:[{2}]\n--",
                   configFile.ConfigurationFilePath,
                   configFile.ConnectionString,
                   configFile.AnalyzeFilePath);
          }
      
          static string GetXml()
          {
              return
                  @"<?xml version='1.0' encoding='UTF-8'?>
                    <ConfigurationFile>
                        <ConfigurationFilePath>Test1</ConfigurationFilePath>
                        <ConnectionString>Test2</ConnectionString>
                        <AnalyzeFilePath>Test3</AnalyzeFilePath>
                    </ConfigurationFile>";
          }
      }
      
      public class ConfigurationFile
      {
          public String ConfigurationFilePath { get; set; }
          public String ConnectionString { get; set; }
          public String AnalyzeFilePath { get; set; }
      
          public ConfigurationFile(String xml)
          {
              XDocument document = XDocument.Parse(xml);
              var root = document.Root;
      
              ConfigurationFilePath = (string)root.Element("ConfigurationFilePath");
              ConnectionString = (string)root.Element("ConnectionString");
              AnalyzeFilePath = (string)root.Element("AnalyzeFilePath");
          }
      }
      

      预期输出

      ConfigurationFilePath:[Test1]
      ConnectionString:[Test2]
      AnalyzeFilePath:[Test3]
      --
      

      【讨论】:

        【解决方案3】:

        简单地说,你也可以使用:

        string yourString = (string)(from element in xDocument.Root.Descendants("ConfigurationFilePath") select element).First();
        

        =D

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-16
          • 1970-01-01
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多