Search
Close this search box.

Reading a complex XML using LINQ in C#

Lets take a sample XML file and name it as Meeting.xml.

<?xml version="1.0" encoding="utf-8"?>
<billing>
  <item>
    <id>1</id>
    <customer>Pavan Kumar Pabothu</customer>
    <type>Daily Scrum Call</type>
    <date>4/5/2012</date>
    <hours>1</hours>
    <contact>
       <phone>
        <no>979107</no>
        <type>home</type>
      </phone>
      <phone>
        <no>9999995929</no>
        <type>mobile</type>
      </phone>
    </contact>
  </item>
  <item>
    <id>2</id>
    <customer>Reddaiah Raju</customer>
    <type>Sprint Meeting</type>
    <date>3/20/2014</date>
    <hours>4</hours>
    <contact>
       <phone>
        <no>2375226</no>
        <type>home</type>
      </phone>
      <phone>
        <no>998884888</no>
        <type>mobile</type>
      </phone>
    </contact>
  </item>
  <item>
    <id>3</id>
    <customer>Kishan Chand Yadav</customer>
    <type>Daily Status Call</type>
    <date>4/20/2014</date>
    <hours>1</hours>
    <contact>
       <phone>
        <no>9988776652</no>
        <type>home</type>
      </phone>
      <phone>
        <no>9988776654</no>
        <type>mobile</type>
      </phone>
    </contact>
  </item>
</billing>

For the above XML we need to create entity objects as below

public class Customer {
  public int ID { get; set; }
  public string Name { get; set; }
  public string MeetingType { get; set; }
  public DateTime CallDate { get; set; }
  public int DurationInHours { get; set; }
  public Contact Contacts { get; set; }
}

public class Contact {
  public List<PhoneContact> Phone = new List<PhoneContact>();
}

public class PhoneContact {
  public string Type { get; set; }
  public string Number { get; set; }
}


And we can read the XML using below code.

// Using LINQ
private List<Customer> GetCustomerList() {
  XElement xmlDoc = XElement.Load(Server.MapPath(@"~/Data/Meeting.xml"));
  var customers = from cust in xmlDoc.Descendants("item") select new Customer {
    ID = Convert.ToInt32(cust.Element("id").Value),
    Name = cust.Element("customer").Value,
    MeetingType = cust.Element("type").Value,
    CallDate = Convert.ToDateTime(cust.Element("date").Value),
    DurationInHours = Convert.ToInt32(cust.Element("hours").Value),
    Contacts =
        new Contact() { Phone =
                            new List<PhoneContact>(from phn in cust.Descendants(
                                "phone") select new PhoneContact {
                              Type = phn.Element("type").Value,
                              Number = phn.Element("no").Value
                            }) }
  };
  return customers.ToList();
}

// Using LAMDA
private List<Customer> GetCustomerList() {
  XElement xmlDoc = XElement.Load(Server.MapPath(@"~/Data/Meeting.xml"));

  var customers = xmlDoc.Descendants("item").Select(cust => new Customer {
    ID = Convert.ToInt32(cust.Element("id").Value),
    Name = cust.Element("customer").Value,
    MeetingType = cust.Element("type").Value,
    CallDate = Convert.ToDateTime(cust.Element("date").Value),
    DurationInHours = Convert.ToInt32(cust.Element("hours").Value),
    Contacts = new Contact { Phone = cust.Descendants("phone")
                                         .Select(phn => new PhoneContact {
                                           Number = phn.Element("type").Value,
                                           Type = phn.Element("no").Value
                                         })
                                         .ToList() }
  });

  return customers.ToList();
}
This article is part of the GWB Archives. Original Author: Absolute Thoughts….

Related Posts