Search code examples
c#xmllistxelement

How can I load list of child elements from XML?


I need to list lineitems inside every inquiry. Below I only get inquiry' values but not list of it's lineitems.

 XElement myElement = XElement.Load("Inquiries.xml");
        var query = from s in myElement.Elements("Inquiry")
                    select new
                    {
                        InquiryId = (int)s.Element("InquiryId"),
                        FirstName = (string)s.Element("FirstName"),
                        LastName = (string)s.Element("LastName"),
                        LineItems = from l in myElement.Elements("Inquiry").Elements("LineItems")
                                   select new
                                   {
                                       Quantity = (int)l.Attribute("quantity"),
                                       PartNumber = (string)l.Attribute("partnumber")
                                   }

                    };

        var result = query.ToList();

XML:

<Inquiries>
  <Inquiry>
    <InquiryId>0</InquiryId>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
    <LineItems>
      <LineItem quantity="2" partnumber="abc"></LineItem>
      <LineItem quantity="3" partnumber="abc"></LineItem>
      <LineItem quantity="6" partnumber="abc"></LineItem>
    </LineItems>
  </Inquiry>
  <Inquiry>
    <InquiryId>1</InquiryId>
    <FirstName>Epic</FirstName>
    <LastName>Beardman</LastName>
    <LineItems>
      <LineItem quantity="2" partnumber="abc"></LineItem>
      <LineItem quantity="3" partnumber="abc"></LineItem>
      <LineItem quantity="6" partnumber="abc"></LineItem>
    </LineItems>
  </Inquiry>
</Inquiries>

Solution

  • XElement myElement = XElement.Load("Inquiries.xml");
    var query = from s in myElement.Elements("Inquiry")
                select new
                {
                    InquiryId = Convert.ToInt32(s.Element("InquiryId").Value),
                    FirstName = s.Element("FirstName").Value,
                    LastName = s.Element("LastName").Value,
                    LineItems = (from l in s.Element("LineItems").Elements("LineItem")
                                select new
                                {
                                    Quantity = Convert.ToInt32(l.Attribute("quantity").Value),
                                    PartNumber = l.Attribute("partnumber").Value
                                }).ToList()
    
                };
    
    var result = query.ToList();