我正在尝试使用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; }
}
答案 0 :(得分:4)
您没有使用您声明的命名空间变量。尝试使用
RssFeed.Descendants(Snmp + "entry")
(同样适用于所有其他您指的是特定名称的地方。)
我并不是说你必须所有你需要解决的问题,但这是最明显的问题。您还应该考虑使用XElement
和XAttribute
的显式转换,而不是Value
属性,例如。
CreatedDate = (DateTime) item.Element(Snmp +"published")
我还鼓励您更多地关注缩进,并在命名局部变量时始终使用pascalCase。 (为什么命名空间变量被称为Snmp
是另一个奇怪的...剪切和粘贴?)