2010-04-07 99 views
5

,这是我的XML的LINQ to 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 code(“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 />"); 
      } 

但我没有得到任何结果返回

+1

试试“2456”,而不是“456”。 – reinierpost 2010-04-07 09:06:33

+1

@reinierpost:不,他正在尝试从Show =“456”迭代子事件标记。值“2456”是一个事件代码。 ;-) – Prutswonder 2010-04-07 09:15:06

+0

@Prutswonder - 你是对的! – 2010-04-07 09:24:51

回答

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

编辑:好的,我现在得到这是一个简短而完整的程序,以显示它的工作。

请注意,如果“Show”元素具有“Date”属性(它不在您的示例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'指出的那样:“不,他试图从Show =”456“迭代子事件标记,值”2456“是事件代码。这是对的。我想返回显示代码'456'的所有日期。所以我需要遍历'Event'元素 – 2010-04-07 09:30:08

+0

@kb:请参阅我的编辑。目前还不清楚你真的想用日期来做什么,但代码*会*找到节目... – 2010-04-07 10:04:47

+0

感谢Jon上面的帖子解决了我的问题!我在想,我可能需要使用添加where子句来遍历事件日期!谢谢 – 2010-04-07 10:48:36

6

改变这一行:

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

要:

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

否则,你是compa将该属性作为对象而不是该属性的值。

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