2010-04-07 16 views
5

utilizando LINQ to XML, esto es una muestra de mi XMLconsulta LINQ to XML atributos

<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> 

¿Cómo puedo devolver una lista de las fechas para un espectáculo specfic? Paso el código del programa ("456") en la cadena de consulta y quiero que todas las fechas/horas se devuelvan como una lista.

Este es el código que tengo hasta ahora:

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

Pero no da resultados positivos regresaron

+1

Try "2456" en lugar de "456". – reinierpost

+1

@reinierpost: No, está intentando iterar las etiquetas de Evento hijo de Show = "456". El valor "2456" es un código de evento. ;-) – Prutswonder

+0

@Prutswonder - ¡tienes razón! –

Respuesta

10

El atributo no va a igual "456" - es un atributo, no una cadena. Sin embargo, si primero lo convierte en una cadena, funcionará.

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

Una alternativa sería la de int para asegurarse de que es numérico:

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

EDIT: Bueno, ahora tengo esto como un programa corto pero completo para mostrar que funcione.

Tenga en cuenta que su código original solo funcionará si el elemento "Mostrar" tiene un atributo "Fecha", que no aparece en su XML de muestra. Tenga en cuenta que está intentando tomar la "Fecha" del elemento "Mostrar" y no el elemento "Evento". No estoy seguro de qué es lo que realmente quería hacer aquí, así que cambié el código para simplemente enviarlo al DateTime?. El código de abajo obras e impresiones 1 (es decir, se ha encontrado el espectáculo único elemento que cumpla con el código):

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

Si eres realidad tratando de encontrar cada fecha del evento dentro del espectáculo, necesita otra "de" cláusula para que sea iterar sobre los eventos dentro del espectáculo:

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

bien, he corregido mi error, ahora estoy evaluando el valor de los atributos, pero todavía no estoy obteniendo ningún resultado. Como 'reinierpost' señala "No, está intentando iterar las etiquetas de eventos hijo de Show =" 456 ". El valor" 2456 "es un código de evento." Esto es correcto. Quiero devolver todas las fechas para el código del programa '456'.Entonces necesito iterar a través de los elementos del 'Evento' –

+0

@kb: Ver mi edición. No está claro qué es lo que realmente intentas hacer con la fecha, pero el código * * encontrará el espectáculo ... –

+0

¡Gracias, tu publicación anterior ha resuelto mi problema! ¡Estaba pensando que necesitaría usar una cláusula add where para iterar a través de las fechas de eventos! gracias –

6

cambiar esta línea:

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

Para:

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

De lo contrario, estás compa suena el atributo como objeto en lugar del valor del atributo.

2

Ésta es otra manera de hacerlo:

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