2014-06-10 67 views
0

=我正在C#中編寫.NET頁面以從WordPress博客中檢索饋送並將其顯示在頁面上。它工作正常,直到我嘗試過濾帖子。如何將XML中的Linq查詢過濾爲IEnumarable對象

我聲明一個XDocument並從URL加載提要。 然後根據Post類將帖子閱讀爲IEnumarable,正如我所說的那樣。問題是我出於某種原因不明白如何按元素過濾。

在查詢中,任何嘗試過濾都會給出錯誤。我已經嘗試了所有我能想到的語法迭代,但它們都會給出錯誤。任何人都可以解釋,所以我可以拍我的頭,我怎麼能過濾類別元素?因爲我無法讓它識別任何像post.Category等我得到的是一個錯誤,post.Category沒有定義。

如果我刪除where子句它工作正常嗎?我究竟做錯了什麼?我使用的語法與MSDN示例完全匹配?編輯以添加:它不是單個等號。我已經改變了這一點,但在複製到網絡時它只是一個錯字。

錯誤總是以「post.Category」(或其他元素名稱)的形式未被定義。我在如何解決where子句中的元素方面缺少一些東西,但我無法弄清楚它是什麼,我的代碼完全匹配幾個MS示例。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml.Linq; 

public partial class _Default : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 

    // Load the blog posts and print the title of the blog 
    string sURL2 = "http://myurl.com/?feed=rss2"; 
    XDocument ourBlog = XDocument.Load(sURL2); 


    // Query the <item>s in the XML RSS data and select each one into a new Post() 
    IEnumerable<Post> posts = 
     from post in ourBlog.Descendants("item") 
     where post.Category == "x" 
     select new Post(post); 
    postRepeater.DataSource = posts; 
    postRepeater.DataBind(); 

    // GridView1.DataSource = posts; 
    // GridView1.DataBind(); 


} 
class Post 
{ 
    public string Title { get; private set; } 
    public DateTime? Date { get; private set; } 
    public string Url { get; private set; } 
    public string Description { get; private set; } 
    public string Category { get; private set; } 
    public string Creator { get; private set; } 
    public string Content { get; private set; } 

    private static string GetElementValue(XContainer element, string name) 
    { 
     if ((element == null) || (element.Element(name) == null)) 
      return String.Empty; 
     return element.Element(name).Value; 
    } 

    public Post(XContainer post) 
    { 
     // Get the string properties from the post's element values 
     Title = GetElementValue(post, "title"); 
     Url = GetElementValue(post, "guid"); 
     Description = GetElementValue(post, "description"); 
     Category = GetElementValue(post, "category"); 
     Creator = GetElementValue(post, 
      "{http://purl.org/dc/elements/1.1/}creator"); 
     // Content = GetElementValue(post, 
     // "{http://purl.org/dc/elements/1.0/modules/content/}encoded"); 
     // Content = GetElementValue(post, "content"); 
     Content = GetElementValue(post, 
      "{http://purl.org/rss/1.0/modules/content/}encoded"); 
     // The Date property is a nullable DateTime? -- if the pubDate element 
     // can't be parsed into a valid date, the Date property is set to null 
     DateTime result; 
     if (DateTime.TryParse(GetElementValue(post, "pubDate"), out result)) 
      Date = (DateTime?)result; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0} by {1}", Title ?? "no title", Creator ?? "Unknown"); 
    } 
} 

}  

回答

2

您的問題是,該ourBlog.Descendants不包含職位,但一個IEnumerable<XElement>

你可以嘗試以下方法:

var posts = from post in ourBlog.Descendants("item") 
      select new Post(post); 
var filteredPosts = from post in posts 
        where post.Category == "x" 
        select post; 

var posts = from post in ourBlog.Descendants("item") 
      where Post.GetElementValue(post, "category") == "x" 
      select new Post(post); 

希望它幫助...

我編輯了第二條語句,因此如果將GetElementValue的可見性更改爲public,它現在應該可以工作。

+0

謝謝,我將其標記爲答案。第一個(頂部)解決方案工作。第二個仍然給出錯誤GetElementValue沒有在當前上下文中定義。我不確定爲什麼會這樣?我想,因爲一切都包含在_Default類,它會好起來的?我嘗試將定義更改爲公開,但沒有任何區別。您能否詳細說明「ourBlog.Descendants不包含帖子」的陳述?你的意思是他們不是帖子,直到他們被閱讀並放置在posts變量中? – valis

+0

只有在用'select new Post(post)'創建帖子後,你纔會創建一個帖子。在此之前,您只有一個XElement。 – david