使用LINQ解析简单的XML文件的C#方法

3

我有一个非常简单的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());
        }
    }
}
3个回答

11
  1. 将其加载为XDocument,因为它是一个文档,而不是一个元素。

var xDoc = XDocument.Load(configurationPAthFileTextbox.Text);
你可以轻松将文档转换为具有元素名称作为键和元素值作为值的 Dictionary<string, string>
var results = xDoc.Root
                  .Elements()
                  .ToDictionary(e => e.Name, e => (string)e);
  • 打印出ConfigurationFilePathConnectionString:

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

    打印 Test1, Test2


    1

    首先,创建一个类来表示您的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]
    --
    

    0

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

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

    =D


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接