在Repeater上的Rss feed给出错误

时间:2017-03-31 05:12:26

标签: c# asp.net gridview rss

我试图在Repeater(或Gridview)上对Rss提供参数但我无法做到。保持“根级别的数据无效。第1行,位置1”。错误。

XmlDocument rssXmlDoc = new XmlDocument();
// Load the RSS file from the RSS URL
rssXmlDoc.Load("http://feeds.skynews.com/feeds/rss/home.xml");
// Parse the Items in the RSS file
XmlNodeList rssNodes = rssXmlDoc.SelectNodes("rss/channel/item");
StringBuilder rssContent = new StringBuilder();
// Iterate through the items in the RSS file
foreach (XmlNode rssNode in rssNodes)
{
    XmlNode rssSubNode = rssNode.SelectSingleNode("title");
    string title = rssSubNode != null ? rssSubNode.InnerText : "";
    rssSubNode = rssNode.SelectSingleNode("link");
    string link = rssSubNode != null ? rssSubNode.InnerText : "";
    rssSubNode = rssNode.SelectSingleNode("description");
    string description = rssSubNode != null ? rssSubNode.InnerText : "";
    // rssContent.Append("<a href='" + link + "'>" + title + "</a><br>" + description);
    rssContent.Append(description);
}
// Return the string that contain the RSS items
DataSet ds = new DataSet();
XmlTextReader reader = new XmlTextReader(new StringReader(rssContent.ToString()));
ds.ReadXml(reader);
rssRepeater.DataSource = ds.Tables[2];
rssRepeater.DataBind();

1 个答案:

答案 0 :(得分:3)

由于这行代码,您将获得异常:

XmlTextReader reader = new XmlTextReader(new StringReader(rssContent.ToString()));
ds.ReadXml(reader);

这种行为是预料之中的,因为您试图将rssContent读作的XML。

这是构建rssContent后的StringBuilder

  

患者将不得不等待更长时间进行非紧急手术并继续前进   没有一些新药计划今天宣布。欧洲   联盟的谈判方式将塑造其未来的关系   英国将由欧洲理事会主席唐纳德设计   据报道,Tusk.Donald Trump的前国家安全顾问   在俄罗斯涉嫌干涉美国的听证会上作证   选举以换取免疫。伊斯兰国家以平民为对象   联盟空袭的诱饵引起公众的强烈抗议   在摩苏尔继续进攻。苏格兰的第一任部长尼古拉·斯特金   将在一封信中告诉Theresa May他们需要开始   独立公投的安排。兴奋正在建设中   新的预告片之后的最新一期“权力的游戏”   节目的第七季发布.Facebook,谷歌,Twitter和   微软已表示将加大打击恐怖分子的力度   与内政大臣会面后的内容。前电力别动队   明星因杀死他的室友而被判入狱六年   在斯诺登尼亚的一架直升机坠毁中死亡的五个人都是   来自同一个家庭,警方已经确认。威斯敏斯特恐怖杀手   一次调查中,哈立德马苏德死于一枪   被告知。

为了防止出现此问题,您必须构建有效的rssContent XML,或者您需要完全避免使用XmlTextReader

我个人会使用XmlSerializer来反序列化XML,然后我会将其作为DataSource传递给转发器。

但是,通过XmlDocument使用您的方法,这是可行的解决方案。首先,您需要创建哪个集合将是转发器的DataSource

public class FeedItem
{
    public string Title { get; set; }

    public string Link { get; set; }

    public string Description { get; set; }
}

然后,当您遍历节点时,需要填充FeedItem集合并将该集合传递到repeater

List<FeedItem> feedItems = new List<FeedItem>();
foreach (XmlNode rssNode in nodes)
{
    var feedItem = new FeedItem();

    XmlNode rssSubNode = rssNode.SelectSingleNode("title");
    feedItem.Title = rssSubNode != null ? rssSubNode.InnerText : "";

    rssSubNode = rssNode.SelectSingleNode("link");
    feedItem.Link = rssSubNode != null ? rssSubNode.InnerText : "";

    rssSubNode = rssNode.SelectSingleNode("description");
    feedItem.Description = rssSubNode != null ? rssSubNode.InnerText : "";
    // rssContent.Append("<a href='" + link + "'>" + title + "</a><br>" + description);

    feedItems.Add(feedItem);
}
rssRepeater.DataSource = feedItems; //Repeater datasource is list of FeedItem objects.
rssRepeater.DataBind();