Linq to XML - 读取多个属性的值。

问题描述 投票:0回答:1

我正试图读取一个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"/>

我试图从上面的xml文件中读取基于BankName的属性值的信息,比如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个回答
0
投票

你可以使用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; }
}

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

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.