Click here to Skip to main content
15,884,176 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I want to output below using 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 file where I read data on

---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>


What I have tried:

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.";
        }

               
    }
}
Posted
Updated 12-Apr-17 11:31am
v2
Comments
CHill60 12-Apr-17 5:04am    
Not clear. What is wrong with the code you have? By the way - don't post empty methods in your code, it just wastes space and it's irritating
Kingsam3 12-Apr-17 8:13am    
Its doesn't return output as required please help
[no name] 12-Apr-17 8:16am    
https://www.codeproject.com/Questions/1180808/How-can-I-read-from-XML-and-write-to-a-textfile-us
CHill60 12-Apr-17 8:19am    
To be fair that has a solution that isn't relevant - although OP should have encouraged that member to delete their solution rather than reposting

1 solution

Not sure i understand you well, but...

Here is what you need for start:
C#
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("");
}


Result:
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


All you need to do is to change above code to your needs.

For furher details, please see:
XDocument Class (System.Xml.Linq)[^]
LINQ to XML (C#)[^]
Basic Queries (LINQ to XML) (C#)[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900