Атрибуты запроса LINQ to XML - PullRequest
       5

Атрибуты запроса LINQ to XML

5 голосов
/ 07 апреля 2010

с использованием LINQ to 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>

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

Это код, который у меня есть:

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

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

Ответы [ 3 ]

10 голосов
/ 07 апреля 2010

Атрибут не равен равно"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
            };

РЕДАКТИРОВАТЬ: ХорошоТеперь у меня есть короткая, но полная программа, показывающая, как она работает.

Обратите внимание, что ваш исходный код будет работать только в том случае, если элемент «Показать» имеет атрибут «Дата», чего нетв вашем образце XML.Обратите внимание, что он пытается получить "Date" из элемента "Show" , а не из элемента "Event" .Я не уверен, что вы действительно хотели сделать здесь, поэтому вместо этого я изменил код на 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());
    }
}

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

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")
             };
6 голосов
/ 07 апреля 2010

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

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

Кому:

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

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

2 голосов
/ 22 июля 2013

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

   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"));
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...