我正在尝试解析来自不同来源的xml feed,一些新闻feed遵循rss2.0标准,另一些则来自不同的来源,如twitter、facebook (这实际上为我提供了rss2.0)和linkedIn。在我把facebook加入进来之前,一切都运行得很完美。我传递了rss20作为格式,因此它应该遵循与普通rss20相同的标准,并且正好适合我的代码,但是它抛出了错误的An error occurred while parsing EntityName并引用了这一行……
XPathNavigator xpn = new XPathDocument(Server.UrlDecode(XmlHelper.GetXmlFeedUrl(appSettings[x]))).CreateNavigator();在我的研究中,我发现facebook feed (research)没有标题集。但我不确定这是否适用,或者是否有更好的方法来做这件事。我曾考虑过SyndicationFeed,但由于推特不支持atom或rss,我认为它不会起作用。
这是facebook的网址..。
http://www.facebook.com/feeds/page.php?format=rss20%26id=6198772858这是我的代码。
protected void Page_Load(object sender, EventArgs e)
{
XmlFeedItemPath xfip;
NameValueCollection appSettings = ConfigurationManager.AppSettings;
List<string> xmlFeeds = appSettings.AllKeys.Where(x => x.StartsWith("XmlFeed")).ToList();
string currentXmlFeedType;
if(!string.IsNullOrEmpty(xmlFeedType))
xmlFeeds.RemoveAll(s => !appSettings[s].Contains(XmlFeedType));
xmlFeeds.ForEach(x =>
{
currentXmlFeedType = XmlHelper.GetXmlFeedType(appSettings[x]);
xfip = XmlHelper.GetXmlFeedItemPath(currentXmlFeedType);
XPathNavigator xpn = new XPathDocument(Server.UrlDecode(XmlHelper.GetXmlFeedUrl(appSettings[x]))).CreateNavigator();
XmlNamespaceManager xmlnsm = XmlHelper.GetXmlNameSpaceManager(xpn);
XPathNodeIterator nodes = xpn.Select(xfip.IteratorPath, xmlnsm);
int i = 0;
foreach (XPathNavigator node in nodes)
{
XmlFeedItems.Add(new XmlFeedItem()
{
Title = string.IsNullOrEmpty(xfip.TitlePath) ? xfip.DefaultTitle : node.SelectSingleNode(xfip.TitlePath, xmlnsm).ToString(),
Link = string.IsNullOrEmpty(xfip.LinkPath) ? null : node.SelectSingleNode(xfip.LinkPath, xmlnsm).ToString(),
Teaser = string.IsNullOrEmpty(xfip.TeaserPath) ? null : XmlHelper.WrapUrlWithAnchorTags(node.SelectSingleNode(xfip.TeaserPath, xmlnsm).ToString()),
Source = string.IsNullOrEmpty(xfip.SourcePath) ? null : xpn.SelectSingleNode(xfip.SourcePath, xmlnsm).ToString(),
SortOrder = i,
XmlFeedType = currentXmlFeedType
});
i++;
}
});
rptRssFeed.DataSource = XmlFeedItems.OrderBy(x => x.SortOrder).Take(10);
rptRssFeed.DataBind();
}发布于 2012-01-16 22:16:52
我想通了。由于facebook feed没有useragent字符串,我必须更改我的实现以使用HttpWebRequest,并手动为每个xml feed (包括facebook)设置一个useragent……
protected void Page_Load(object sender, EventArgs e)
{
XmlFeedItemPath xfip;
NameValueCollection appSettings = ConfigurationManager.AppSettings;
List<string> xmlFeeds = appSettings.AllKeys.Where(x => x.StartsWith("XmlFeed")).ToList();
string currentXmlFeedType;
if(!string.IsNullOrEmpty(xmlFeedType))
xmlFeeds.RemoveAll(s => !appSettings[s].Contains(XmlFeedType));
xmlFeeds.ForEach(x =>
{
currentXmlFeedType = XmlHelper.GetXmlFeedType(appSettings[x]);
xfip = XmlHelper.GetXmlFeedItemPath(currentXmlFeedType);
var request = (HttpWebRequest)WebRequest.Create(Server.UrlDecode(XmlHelper.GetXmlFeedUrl(appSettings[x])));
request.Method = "GET";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";
XPathNavigator xpn = new XPathDocument(XmlReader.Create(request.GetResponse().GetResponseStream())).CreateNavigator();
XmlNamespaceManager xmlnsm = XmlHelper.GetXmlNameSpaceManager(xpn);
XPathNodeIterator nodes = xpn.Select(xfip.IteratorPath, xmlnsm);
int i = 0;
foreach (XPathNavigator node in nodes)
{
string publishDate = string.IsNullOrEmpty(xfip.PublishDatePath) ? null : node.SelectSingleNode(xfip.PublishDatePath, xmlnsm).ToString();
XmlFeedItems.Add(new XmlFeedItem()
{
Title = string.IsNullOrEmpty(xfip.TitlePath) ? xfip.DefaultTitle : node.SelectSingleNode(xfip.TitlePath, xmlnsm).ToString(),
Link = string.IsNullOrEmpty(xfip.LinkPath) ? null : node.SelectSingleNode(xfip.LinkPath, xmlnsm).ToString(),
Teaser = string.IsNullOrEmpty(xfip.TeaserPath) ? null : XmlHelper.WrapUrlWithAnchorTags(HttpUtility.HtmlDecode(node.SelectSingleNode(xfip.TeaserPath, xmlnsm).ToString())),
Source = string.IsNullOrEmpty(xfip.SourcePath) ? null : xpn.SelectSingleNode(xfip.SourcePath, xmlnsm).ToString(),
SortOrder = i,
XmlFeedType = currentXmlFeedType,
PublishDate = string.IsNullOrEmpty(publishDate) ? new DateTime() : DateTime.Parse(publishDate.Remove(publishDate.IndexOf(" +")))
});
i++;
}
});
rptRssFeed.DataSource = XmlFeedItems.OrderBy(x => x.GetType().GetProperty(sortField)).Take(10);
rptRssFeed.DataBind();
} https://stackoverflow.com/questions/8866506
复制相似问题