с помощью LINQ для XML это - образец моего 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? Я передаю выставочный код ("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 />");
}
Но я не получаю возвращенных результатов
Атрибут не будет равным «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
};
РЕДАКТИРОВАТЬ: Хорошо, теперь у меня есть короткая, но полная программа, чтобы показать, как она работает.
Обратите внимание, что ваш исходный код будет работать только в том случае, если элемент «Show» имеет атрибут «Date», которого нет в вашем примере XML. Обратите внимание, что он пытается взять «Дата» из элемента «Показать» , а не из элемента «Событие» . Я не уверен, что вы действительно хотели здесь сделать, поэтому я изменил код, просто приведя его к DateTime?
. Приведенный ниже код работает и печатает 1 (т. Е. Обнаружен единственный элемент Show, соответствующий коду):
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")
};
Измените эту строку:
where feed.Attribute("Code").Equals("456")
To:
where feed.Attribute("Code").Value.Equals("456")
В противном случае вы сравниваете атрибут как объект, а не значение атрибута.