2012-01-15 73 views
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(); 
} 

回答

0

我想通了。由於臉書飼料沒有useragent字符串我不得不改變我的實施使用HttpWebRequest和手動設置每個XML飼料(臉譜包括)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(); 
}