1

I am trying to poulate all the elements of an order to a listbox. The listbox just adds the collection, not the elements. Please help!

XDocument doc = XDocument.Load(Server.MapPath("App_Data/Orders.xml"));

        string order = ddl.SelectedValue;

        var results = doc.Descendants("Order").Where(o => o.Attribute("OrderNumber").Value == "SO43659")
                         .Select(o => o.Elements("LineItem"));

        foreach (var r in results)
        {
          ListBox1.Items.Add(new ListItem(r.ToString()));

        }

xml fragment:

<Order OrderNumber="SO43659">
    <LineItem Line="1" PID="349" Qty="1" Price="2024.9940" Freight="50.6249" />
    <LineItem Line="2" PID="350" Qty="3" Price="2024.9940" Freight="151.8746" />
    <LineItem Line="3" PID="351" Qty="1" Price="2024.9940" Freight="50.6249" />
    <LineItem Line="4" PID="344" Qty="1" Price="2039.9940" Freight="50.9999" />
    <LineItem Line="5" PID="345" Qty="1" Price="2039.9940" Freight="50.9999" />
    <LineItem Line="6" PID="346" Qty="2" Price="2039.9940" Freight="101.9997" />
    <LineItem Line="7" PID="347" Qty="1" Price="2039.9940" Freight="50.9999" />
    <LineItem Line="8" PID="229" Qty="3" Price="28.8404" Freight="2.1630" />
    <LineItem Line="9" PID="235" Qty="1" Price="28.8404" Freight="0.7210" />
    <LineItem Line="10" PID="218" Qty="6" Price="5.7000" Freight="0.8550" />
    <LineItem Line="11" PID="223" Qty="2" Price="5.1865" Freight="0.2593" />
    <LineItem Line="12" PID="220" Qty="4" Price="20.1865" Freight="2.0187" />
  </Order>
1
  • What exactly are you trying to display in the dropdown, any particulat attribute of LineItem? Commented Sep 15, 2011 at 12:35

2 Answers 2

2
var results = doc.Descendants("Order")
                 .Where(o => o.Attribute("OrderNumber").Value == "SO43659")
                 .FirstOrDefault();

foreach (var r in results.Elements("LineItem"))
{
    ListBox1.Items.Add(new ListItem(r.ToString()));
}
Sign up to request clarification or add additional context in comments.

Comments

1

If you didn't use var, you'd see what's wrong - each elements of results is a sequence of elements. Here's your code without var:

IEnumerable<IEnumerable<XElement>> results =
   doc.Descendants("Order")
      .Where(o => o.Attribute("OrderNumber").Value == "SO43659")
      .Select(o => o.Elements("LineItem"));

foreach (IEnumerable<XElement> r in results)
{
    ListBox1.Items.Add(new ListItem(r.ToString()));

}

I suspect that's not what you're after. You could use this instead:

// Will go bang if there isn't exactly one matching order
IEnumerable<XElement> results =
   doc.Descendants("Order")
      .Where(o => o.Attribute("OrderNumber").Value == "SO43659")
      .Single()
      .Select(o => o.Elements("LineItem"));

Or:

// Will find *all* the LineItem elements under *all* matching orders
IEnumerable<XElement> results =
   doc.Descendants("Order")
      .Where(o => o.Attribute("OrderNumber").Value == "SO43659")
      .SelectMany(o => o.Elements("LineItem"));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.