如何使用linq to xml读取stackoverflow rss feed

时间:2012-01-27 10:07:27

标签: c# asp.net linq-to-xml

我正在尝试使用Linq to xml读取堆栈溢出的rss feed。我无法获取入口节点,因为它返回空列表。到目前为止我已经尝试过,任何人都可以指出我在这里做错了吗?

这里我绑定到网格视图:

private void StackoverflowFeedList()
{
    grdFeedView.DataSource = StackoverflowUtils.GetStackOverflowFeeds();
    grdFeedView.DataBind();
}

这是获取所有Feed的方法:

public static IEnumerable<StackOverflowFeedItems> GetStackOverflowFeeds ()
{
    XNamespace Snmp = "http://www.w3.org/2005/Atom";
    XDocument RssFeed = XDocument.Load(@"http://stackoverflow.com/feeds");
    var posts = from item in RssFeed.Descendants("entry")
                select new StackOverflowFeedItems
                {
                   QuestionID = item.Element(Snmp +"id").Value,
                   QuestionTitle = item.Element(Snmp +"title").Value,
                   AuthorName = item.Element(Snmp +"name").Value,
                   CategoryTag = (from category in item.Elements(Snmp +"category")
                                  orderby category
                                  select category.Value).ToList(),
                   CreatedDate = DateTime.Parse(item.Element(Snmp +"published").Value),
                   QuestionSummary = item.Element(Snmp +"summary").Value
                };
    return posts.ToList();
}

这是我用来绑定的类:

public class StackOverflowFeedItems
{
    public string   QuestionID { get; set; }
    public string   QuestionTitle { get; set; }
    public IEnumerable<string> CategoryTag { get; set; }
    public string AuthorName { get; set;  }
    public DateTime CreatedDate { get; set; }
    public string QuestionSummary { get; set; }
}

1 个答案:

答案 0 :(得分:4)

您没有使用您声明的命名空间变量。尝试使用

RssFeed.Descendants(Snmp + "entry")

(同样适用于所有其他您指的是特定名称的地方。)

我并不是说你必须所有你需要解决的问题,但这是最明显的问题。您还应该考虑使用XElementXAttribute的显式转换,而不是Value属性,例如。

CreatedDate = (DateTime) item.Element(Snmp +"published")

我还鼓励您更多地关注缩进,并在命名局部变量时始终使用pascalCase。 (为什么命名空间变量被称为Snmp是另一个奇怪的...剪切和粘贴?)