Kingsam3 Ответов: 1

Я хочу использовать LINQ для преобразования XML для вывода в текстовый файл, выполнив GROUPBY в поле "банк".


Я хочу вывести ниже, используя C# linq

First National B0020000045603
GSinclair       408999703657  CH Fourways  002750001122012
THenderson      401255489873  CH Edenvale  001810313122012

ABSA            0040000146162
ZWhitehead      409122372301  CH Irene     000702501122012
KCooke          409155874935  SAVSouthdowns009758901012013
BJames             409254998  SAVMelville  002077409122012
SLane              409771987  SAVRoodepoort002077431122012


XML-файл, в котором я читаю данные

---DebitOrder.xml----

<debitorders>
  <deduction>
    <accountholder>Georgina Sinclair</accountholder>
	<accountnumber>408999703657</accountnumber>
	<accounttype>cheque</accounttype>
	<bankname>First National Bank</bankname>
	<branch>Fourways</branch>
	<amount>275.00</amount>
	<date>12/01/2012</date>
  </deduction>
  <deduction>
    <accountholder>Zachary Whitehead</accountholder>
	<accountnumber>409122372301</accountnumber>
	<accounttype>cheque</accounttype>
	<bankname>ABSA</bankname>
	<branch>Irene</branch>
	<amount>70.25</amount>
	<date>12/01/2012</date>
  </deduction>
  <deduction>
    <accountholder>Toby Henderson</accountholder>
	<accountnumber>401255489873</accountnumber>
	<accounttype>cheque</accounttype>
	<bankname>First National Bank</bankname>
	<branch>Edenvale</branch>
	<amount>181.03</amount>
	<date>12/13/2012</date>
  </deduction>
  <deduction>
    <accountholder>Katherine Cooke</accountholder>
	<accountnumber>409155874935</accountnumber>
	<accounttype>savings</accounttype>
	<bankname>ABSA</bankname>
	<branch>Southdowns</branch>
	<amount>975.89</amount>
	<date>01/01/2013</date>
  </deduction>
  <deduction>
    <accountholder>Bradley James</accountholder>
	<accountnumber>409254998</accountnumber>
	<accounttype>savings</accounttype>
	<bankname>ABSA</bankname>
	<branch>Melville</branch>
	<amount>207.74</amount>
	<date>12/09/2012</date>
  </deduction>
  <deduction>
    <accountholder>Sophie Lane</accountholder>
	<accountnumber>409771987</accountnumber>
	<accounttype>savings</accounttype>
	<bankname>ABSA</bankname>
	<branch>Roodepoort</branch>
	<amount>207.74</amount>
	<date>12/31/2012</date>
  </deduction>
</debitorders>


Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Xml.Linq;
using System.Text;
using System.Windows.Forms;
using System.Linq;
using System.IO;
using System.Xml;

namespace DebitOrderSolution
{
    public partial class Index : Form
    {

        static public string XMLRead()
        {
            string onlyContent = "";
            DataSet ds = new DataSet();
            string Strpath = @"C:\zms\DebitOrders\DebitOrders";
            try
            {
                ds.ReadXml(Strpath + "\\DebitOrders.xml");
                if (ds.Tables.Count != 0)
                {
                    DataTable dtXml = ds.Tables[0];

                    foreach (DataRow dr in dtXml.Rows)
                    {
                        onlyContent += dr[0].ToString();
                    }
                }
            }
            catch
            {
                return Environment.MachineName;
            }
            return onlyContent;
        }
        public Index()
        {
            InitializeComponent();
        }

        string onlyContent = string.Empty;

        private void butAdd_Click(object sender, EventArgs e)
        {
            addToXml();
        }

        private void addToXml()
        {

          
           XDocument xmlDoc = XDocument.Load("DebitOrders.xml");
         
            var debitorders = from deduction in xmlDoc.Descendants("deduction")                            
                              select new
                              {
                                  Accountholder = deduction.Element("accountholder").Value,
                                  Accountnumber = deduction.Element("accountnumber").Value,
                                  Accounttype = deduction.Element("accounttype").Value,
                                  Bankname = deduction.Element("bankname").Value,
                                  Branch = deduction.Element("branch").Value,
                                  Amount = deduction.Element("amount").Value,
                                  Date = deduction.Element("date").Value,

                                  
                              };

            var grouped = from deduction in debitorders
                          group deduction by deduction.Bankname into g
                          select new
                          {
                              Bankname = g.Key,
                              bankname = g.First().Bankname
                              //Accountnumber = g.First().Bankname,
                              //Accounttype = g.First().Bankname,
                              //Branch = g.First().Bankname,
                              //Amount = g.First().Bankname,
                              //Date = g.First().Bankname

                          };

                       var groupData = new XElement("deduction",
                        from g in grouped
                        select new XElement("bankname",
                                new XElement("Bankname", g.Bankname)
                                //,
                                //new XElement("accountholder", g.Bankname),
                                //new XElement("Accounttype", g.Bankname),
                                //new XElement("Branch", g.Bankname),
                                //new XElement("accountholder", g.Bankname),
                                //new XElement("Amount", g.Bankname),
                                //new XElement("Date", g.Bankname)
                            )
                        );
            //var debitorders = xmlDoc.SelectNodes("debitorders/deduction");
            txtResults.Text = "";
            
            foreach (var deduction in debitorders)
            {
                onlyContent += string.Concat(txtResults.Text + " " + deduction.Accountholder + "\t");
                onlyContent += string.Format(txtResults.Text + " " + deduction.Accountnumber + "\t");
                onlyContent += string.Format(txtResults.Text + " " + deduction.Accounttype + "\t");
                onlyContent += string.Format(txtResults.Text + " " + deduction.Bankname + "\t");
                onlyContent += string.Format(txtResults.Text + " " + deduction.Branch +"\t" );
                onlyContent += string.Format ( txtResults.Text + " " + deduction.Date + "\n\n");
                
                
               }

            if (txtResults.Text == "")
                txtResults.Text = "No Results.";

            File.WriteAllText(@"C:\zms\DebitOrderSolution\DebitOrders.txt", onlyContent);

            Close();
        }

        private void butReadXML_Click(object sender, EventArgs e)
        {
            readXml();
        }

        private void readXml()
        {
            XDocument xmlDoc = XDocument.Load("DebitOrders.xml");

            var debitorders = from deduction in xmlDoc.Descendants("deduction")
                select new
                {
                    Accountholder = deduction.Element("accountholder").Value,
                    Accountnumber = deduction.Element("accountnumber").Value,
                    Accounttype = deduction.Element("accounttype").Value,
                    Bankname = deduction.Element("bankname").Value,
                    Branch = deduction.Element("branch").Value,
                    Amount = deduction.Element("amount").Value,
                    Date = deduction.Element("date").Value,
                };



            txtResults.Text = "";
            foreach (var deduction in debitorders )
            {
                txtResults.Text = txtResults.Text + " " + deduction.Accountholder + "\t";
                txtResults.Text = txtResults.Text + " " + deduction.Accountnumber + "\t";
                txtResults.Text = txtResults.Text + " " + deduction.Accounttype + "\t";
                txtResults.Text = txtResults.Text + " " + deduction.Bankname + "\t";
                txtResults.Text = txtResults.Text + " " + deduction.Branch + "\t";
                txtResults.Text = txtResults.Text + " " + deduction.Date + "\n\n";
            }
            
            if (txtResults.Text == "")
                txtResults.Text = "No Results.";
        }

               
    }
}

CHill60

Непонятный. Что не так с кодом, который у вас есть? Кстати - не размещайте пустые методы в своем коде, это просто пустая трата места и раздражает

Kingsam3

Он не возвращает вывод по мере необходимости пожалуйста помогите

[no name]

https://www.codeproject.com/Questions/1180808/How-can-I-read-from-XML-and-write-to-a-textfile-us

CHill60

Честно говоря, у этого есть решение, которое не имеет отношения к делу, хотя OP должен был поощрять этого участника удалять свое решение, а не перепечатывать его

1 Ответов

Рейтинг:
11

Maciej Los

Не уверен, что хорошо вас понимаю, но ... ..

Вот что вам нужно для начала:

XDocument xdoc = XDocument.Load("FullFileNameHere");
var result = xdoc.Root.Descendants("deduction")
	.GroupBy(x=>x.Element("bankname").Value)
	.Select(grp=>new
		{
			Bank = grp.Key,
			Accounts = grp.Select(y=> new
				{
					Holder = y.Element("accountholder").Value,
					Number = y.Element("accountnumber").Value,
					Type = y.Element("accounttype").Value,
					Branch = y.Element("branch").Value,
					Amount = y.Element("amount").Value, 
					Date = y.Element("date").Value 
				})
				.ToList()
		})
		.ToList();

foreach(var ba in result)
{
	Console.WriteLine("{0}", ba.Bank);
	foreach(var d in ba.Accounts)
	{
		Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", d.Holder, d.Number, d.Type, d.Branch, d.Amount, d.Date);
	}
	Console.WriteLine("");
}


Результат:
First National Bank
Georgina Sinclair  408999703657  cheque  Fourways  275.00  12/01/2012
Toby Henderson  401255489873  cheque  Edenvale  181.03  12/13/2012

ABSA
Zachary Whitehead  409122372301  cheque  Irene  70.25  12/01/2012
Katherine Cooke  409155874935  savings  Southdowns  975.89  01/01/2013
Bradley James  409254998  savings  Melville  207.74  12/09/2012
Sophie Lane  409771987  savings  Roodepoort  207.74  12/31/2012


Все, что вам нужно сделать, это изменить приведенный выше код в соответствии с вашими потребностями.

Для получения более подробной информации, пожалуйста, смотрите:
Классе XDocument (Системы.В формате XML.В LINQ)[^]
LINQ to XML (C#)[^]
Основные запросы (LINQ to XML) (C#)[^]