2010-04-07 95 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")); 
}