1
我想解析出來自不同來源的XML提要,一些新聞提要遵循rss2.0標準和其他來自不同來源,如Twitter,Facebook(其實給了我rss2.0的選項)並linkedIn。直到我將Facebook投入混音之前,所有內容都完美運行。我通過rss20作爲格式,所以應該遵循相同的標準作爲正常的RSS提要,並配合正確的到我的代碼,但它拋出錯誤An error occurred while parsing EntityName
和引用這條線......EntityName解析錯誤 - XPathDocument
XPathNavigator xpn = new XPathDocument(Server.UrlDecode(XmlHelper.GetXmlFeedUrl(appSettings[x]))).CreateNavigator();
在我的研究,我發現,沒有爲Facebook供稿設置的標題(research)。但我並不確定這是否適用,或者是否有更好的方法來解決這個問題。我想過SyndicationFeed
,但由於twitter不遵循原子或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();
}