如何过滤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");
}
}
}
您的问题是: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,那么它现在应该可以工作了。