如何过滤Linq查询从XML到IEnumerable的对象

本文关键字:XML IEnumerable 对象 查询 Linq 何过滤 过滤 | 更新日期: 2023-09-27 18:08:13

=我正在用c#编写一个。net页面,从WordPress博客中检索提要并将其显示在页面上。它工作得很好,直到我尝试过滤帖子。

我声明了一个XDocument并从URL加载提要。然后阅读帖子,基于Post类,进入ienumable,正如我所说的,这一切都有效。问题是,出于某种原因,我不明白如何按元素进行过滤。

在查询中,任何尝试过滤都会产生错误。我试过了所有我能想到的语法,但它们都有错误。有没有人能解释一下,我怎么过滤Category元素?因为我无法让它识别post之类的东西。类别等。我得到的只是一个错误。类别没有定义。

如果我删除where子句它工作得很好吗?我做错了什么?我使用的语法与MSDN示例完全匹配?编辑补充:这不是一个单独的等号。我已经改变了,但这只是一个打印错误时,复制到网络。

错误总是以"post"的形式出现。没有定义"类别"(或其他元素名称)。我在如何处理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");
    }
}
}     

如何过滤Linq查询从XML到IEnumerable的对象

您的问题是:Descendants不包含Posts,但包含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,那么它现在应该可以工作了。

相关文章: