2010-04-07 4 views
5

с помощью LINQ к XML, это образец моего XMLLINQ для запроса 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> 

Как вернуть список дат для specfic шоу? Я передаю код show («456») в querystring и хочу, чтобы все даты/время возвращались в виде списка.

Это код, который я до сих пор:

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 />"); 
      } 

Но я получаю никаких результатов не дал

+1

Try «2456» вместо «456». – reinierpost

+1

@reinierpost: Нет, он пытается перебрать дочерние теги событий из Show = "456". Значение «2456» - это код события. ;-) – Prutswonder

+0

@Prutswonder - вы правы! –

ответ

10

Атрибут не будет равным «456» - это атрибут, а не строка. Однако, если вы сначала преобразуете его в строку, это сработает.

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

Альтернатива была бы int, чтобы убедиться, что это числовое:

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

EDIT: Хорошо, я теперь получил это как короткую, но полную программу, чтобы показать его работу.

Обратите внимание, что ваш исходный код будет работать, только если элемент «Показать» имеет атрибут «Дата», которого нет в вашем примере XML. Обратите внимание, что он пытается взять «Дата» с «Показать» элемент не «Событие» элемент. Я не уверен, что вы действительно хотели сделать здесь, поэтому я изменил код, чтобы просто перевести его на DateTime?. Код ниже работ и гравюр 1 (т.е. он нашел единственный Показать элемент, соответствующий код):

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()); 
    } 
} 

Если вы на самом деле пытаетесь найти все даты событий в рамках шоу, вам нужно еще один «от» пункт, чтобы сделать его перебирать события в шоу:

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") 
      }; 
+0

ОК, я исправил свою ошибку, теперь я оцениваю значение атрибутов, но я до сих пор не получаю никаких результатов. Как «reinierpost» указывает «Нет, он пытается повторить дочерние тэги Event из Show =« 456 ». Значение« 2456 »- это код события». Это верно. Я хочу вернуть все даты для показа кода «456».Поэтому мне нужно перебирать элементы «События» –

+0

@kb: см. Мое редактирование. Непонятно, что вы на самом деле пытаетесь сделать с датой, но код * будет * найти шоу ... –

+0

Спасибо, Jon Ваше сообщение выше решило мою проблему! я думал, что мне, возможно, придется использовать дополнение, где предложение перебирать через Даты событий! спасибо –

6

Измените эту строку:

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

To:

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

В противном случае вы являетесь компасом кольцо атрибута как объекта вместо значения атрибута.

2

Вот еще один способ сделать это:

var nodes = xmlFile.Nodes() 
    .OfType<XElement>() 
    .DescendantNodes() 
    .OfType<XElement>() 
    .Where(x => x.Name.LocalName == "Event" && x.Attribute("Code").Value.Contains("456")); 
foreach (var node in nodes) 
{ 
    Console.WriteLine(node.Attribute("Code")); 
}