【问题标题】:Linq to XML - to read a values of multiple attributesLinq to XML - 读取多个属性的值
【发布时间】:2020-08-28 23:54:45
【问题描述】:

我正在尝试读取用于连接特定属性值的 XML 文件。我有一个带有一堆属性的元素,如下所示:

<storeSurvey Annualsales="150000" BankName="Primary Bank" BusinessType="05" YearOpened="1980" Location="New Hampshire"/>
<storeSurvey Annualsales="300000" BankName="Flagstar Bank" BusinessType="07" YearOpened="1993" Location="Michigan"/>
<storeSurvey Annualsales="250000" BankName="Stifel" BusinessType="02" YearOpened="1890" Location="Missouri"/>
<storeSurvey Annualsales="500000" BankName="Frost Bank" BusinessType="08" YearOpened="1868" Location="Texas"/>
<storeSurvey Annualsales="750000" BankName="Webster Bank" BusinessType="05" YearOpened="1935" Location="Connecticut"/>
<storeSurvey Annualsales="950000" BankName="CIT Group" BusinessType="02" YearOpened="1908" Location="New York"/>

我正在尝试根据 BankName 从上述 xml 文件中检索 YearOpened 和 Location 等属性值的信息。

我已经尝试了以下逻辑,但出现了一些错误。我对 xml 查询还很陌生,任何建议都将不胜感激。

public static void Main(string[] args)
{
   string[] arguments = Environment.GetCommandLineArgs();
   args[0] = Path.GetDirectoryName(args[0]);
   DataLocation = Path.Combine(args[0], "ListofBanks.xml");  

   // ReaderOptions Data from XML file and retriving Data
   XDocument xml = XDocument.Load(DataLocation);
   var criteria = new[] { "Stifel", "Frost Bank", "Primary Bank"};
   var items = from item in xml.Root.Descendants("storeSurvey")
               where item.Attribute("BankName").Value.Contains(criteria)
               select new
               {
                  Founded = (string)item.Attribute("YearOpened"),
                  HeadQuarters = (string)item.Attribute("Location"),
               };

   foreach(var value in items)
   {
      Console.WriteLine(value.Founded + " " + value.HeadQuarters);
   }

   Console.Read();
 }

使用上述逻辑,我在条件的 where 条件中遇到错误(Argument1:无法从 String[] 转换为字符串以及在 foreach 条件“items”中 - foreach 语句不能对类型的变量进行操作? ' 因为 '?' 不包含 'GetEnumerator' 的公共实例定义。

我正在尝试在我的控制台窗口上实现以下目标:

1890 Missouri
1868 Texas
1980 New Hampshire

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    使用以下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                XDocument doc = XDocument.Load(FILENAME);
                var results = doc.Descendants("storeSurvey").Select(x => new
                {
                    sales = (decimal)x.Attribute("Annualsales"),
                    bank = (string)x.Attribute("BankName"),
                    businessType = (int)x.Attribute("BusinessType"),
                    opened = (int)x.Attribute("YearOpened"),
                    location = (string)x.Attribute("Location")
                }).ToList();
            }
    
        }
    }
    

    【讨论】:

    • 感谢@jdweng 的回复。但是您的逻辑没有过滤任何东西,即我试图过滤输出仅针对特定条件:银行名称。另外,我正在尝试将输出写入控制台窗口,您的逻辑不包含任何 console.WriteLine 语句。所以,我不认为寻找这个输出。您的逻辑只是读取所有参数的 xml 文件并将其存储到结果变量中。
    • 我辛苦了。从我的查询中过滤结果很容易。
    【解决方案2】:

    您可以使用 jdweng 共享的代码并应用 Linq 表达式 WhereClause

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
    
        static void Main(string[] args)
        {
            string[] validBankNames = new [] { "Stifel", "Frost Bank", "Primary Bank" };
    
            XDocument xDocument = XDocument.Load(FILENAME);
    
            var results = xDocument.Descendants("storeSurvey")
                            .Select(x => new Bank
                            {
                                AnnualSales = (int)x.Attribute("Annualsales"),
                                BankName = (string)x.Attribute("BankName"),
                                BusinessType = (string)x.Attribute("BusinessType"),
                                YearOpened = (int)x.Attribute("YearOpened"),
                                Location = (string)x.Attribute("Location")
                            })
                            .Where(bank=> validBankNames.Contains(bank.BankName))
                            .ToList();
    
            results.ForEach(x => Console.WriteLine($"{x.YearOpened} {x.BankName}"));
    
            Console.ReadKey();
        }
    }
    
    public class Bank
    {
        public string BankName { get; set; }
        public int AnnualSales { get; set; }
        public string BusinessType { get; set; }
        public int YearOpened { get; set; }
        public string Location { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2016-06-10
      • 2013-02-22
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多