tags:

views:

210

answers:

2

Hi

using LINQ to XML, this is a sample of my XML

<shows>
 <Show Code="456" Name="My Event Name">
   <Event Code="2453" VenueCode="39" Date="2010-04-13 10:30:00" /> 
   <Event Code="2454" VenueCode="39" Date="2010-04-13 13:30:00" /> 
   <Event Code="2455" VenueCode="39" Date="2010-04-14 10:30:00"  /> 
   <Event Code="2456" VenueCode="39" Date="2010-04-14 13:30:00" /> 
   <Event Code="2457" VenueCode="39" Date="2010-04-15 10:30:00" /> 
 </Show>

 <Show... />
 <Show... />
</shows>

How do I return a list of the Dates for a specfic show? I am passing the show code ("456") in the querystring and want all the dates/times returned as a list.

This is the code i have so far:

XDocument xDoc = XDocument.Load("path to xml");

            var feeds = from feed in xDoc.Descendants("Show")
                        where feed.Attribute("Code").Equals("456")
                        select new
                        {
                            EventDate = feed.Attribute("Date").Value
                        };

            foreach(var feed in feeds)
            {
                Response.Write(feed.EventDate + "<br />");
            }

But i get no results returned

+4  A: 

Change this line:

where feed.Attribute("Code").Equals("456")

To:

where feed.Attribute("Code").Value.Equals("456")

Otherwise you're comparing the attribute as object instead of the attribute's value.

Prutswonder
+2  A: 

The attribute isn't going to equal "456" - it's an attribute, not a string. However, if you convert it to a string first, it will work.

var feeds = from feed in xDoc.Descendants("Show")
            where (string)feed.Attribute("Code") == "456"
            select new
            {
                EventDate = feed.Attribute("Date").Value
            };

An alternative would be to int to make sure it's numeric:

var feeds = from feed in xDoc.Descendants("Show")
            where (int) feed.Attribute("Code") == 456
            select new
            {
                EventDate = feed.Attribute("Date").Value
            };

EDIT: Okay, I've now got this as a short but complete program to show it working.

Note that your original code will only work if the "Show" element has a "Date" attribute - which it doesn't in your sample XML. Note that it's trying to take the "Date" from the "Show" element not the "Event" element. I'm not sure what you really wanted to do here, so I've changed the code to just cast to DateTime? instead. The code below works and prints 1 (i.e. it's found the single Show element matching the code):

using System;
using System.Linq;
using System.Xml.Linq;

public static class Test
{    
    static void Main(string[] args)
    {
        XDocument xDoc = XDocument.Load("shows.xml");
        var feeds = from feed in xDoc.Descendants("Show")
                    where (int) feed.Attribute("Code") == 456
                    select new
                    {
                        EventDate = (DateTime?) feed.Attribute("Date")
                    };

        Console.WriteLine(feeds.Count());
    }
}

If you're actually trying to find every event date within the show, you need another "from" clause to make it iterate over the events within the show:

var events = from feed in xDoc.Descendants("Show")
             where (int) feed.Attribute("Code") == 456
             // We can't use event as an identifier, unfortunately
             from ev in feed.Elements("Event")
             select new
             {
                 EventDate = (DateTime?) ev.Attribute("Date")
             };
Jon Skeet
ok, i've corrected my mistake, I am now evaluating the attributes' value, but I am still getting no results. As 'reinierpost' points out "No, he's trying to iterate the child Event tags from Show="456". Value "2456" is an Event code." This is correct. I want to return all dates for the show code '456'. So i need to iterate through the 'Event' elements
kb
@kb: See my edit. It's not clear what you're really trying to do with the date, but the code *will* find the show...
Jon Skeet
Thanks Jon your post above has solved my problem! i was thinking that i may need to use an addition where clause to iterate through the Events Dates! thank you
kb
nice tip to invert the equal. I like it. But it could just as well use the operator == and no trick would be needed, or am I missing smthg?
Stephane
@serbrech: Nope, not missing anything at all. I'm silly :) Will edit.
Jon Skeet