65.9K
CodeProject 正在变化。 阅读更多。
Home

ATOM 到 RSS 转换器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.76/5 (5投票s)

2007年10月25日

CPOL
viewsIcon

27641

本文将帮助您找到一种将 ATOM 转换为 RSS Feed 格式的方法

引言

如今我们知道信息共享中 Feed 起着重要作用。RSS 使人们能够以比手动检查更轻松的自动化方式及时了解他们喜爱的网站。

除此之外,还出现了许多其他版本,如 RDF、ATOM。这里提供的代码可以帮助将 RDF Feed 转换为 RSS Feed 格式。

Using the Code

此代码将 ATOM 内容作为参数,然后返回 XML 内容,该内容采用 RSS Feed 格式

//
public string AtomToRssConverter(XmlDocument atomDoc)
        {
            XmlDocument xmlDoc = atomDoc;
            XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
            mgr.AddNamespace("atom", "http://purl.org/atom/ns#");
            const string rssVersion = "2.0";
            const string rssLanguage = "en-US";
            string rssGenerator = "RDFFeedConverter";
            MemoryStream memoryStream = new MemoryStream();
            XmlTextWriter xmlWriter = new XmlTextWriter(memoryStream, null);
            xmlWriter.Formatting = Formatting.Indented;
            string feedTitle = xmlDoc.SelectSingleNode("//atom:title", mgr).InnerText;
            string feedLink = xmlDoc.SelectNodes("//atom:link/@href", mgr)[2].InnerText;
            string rssDescription = xmlDoc.SelectSingleNode
				("//atom:tagline", mgr).InnerText;
            xmlWriter.WriteStartElement("rss");
            xmlWriter.WriteAttributeString("version", rssVersion);
            xmlWriter.WriteStartElement("channel");
            xmlWriter.WriteElementString("title", feedTitle);
            xmlWriter.WriteElementString("link", feedLink);
            xmlWriter.WriteElementString("description", rssDescription);
            xmlWriter.WriteElementString("language", rssLanguage);
            xmlWriter.WriteElementString("generator", rssGenerator);
            XmlNodeList items = xmlDoc.SelectNodes("//atom:entry", mgr);
            if (items == null)
                throw new FormatException("Atom feed is not in expected format. ");
            else
            {
                string title = String.Empty;
                string link = String.Empty;
                string description = String.Empty;
                string author = String.Empty;
                string pubDate = String.Empty;
                for (int i = 0; i < items.Count; i++)
                {
                    XmlNode nodTitle = items[i];
                    title = nodTitle.SelectSingleNode("atom:title", mgr).InnerText;
                    link = items[i].SelectSingleNode("atom:link[@rel='alternate']", 
					mgr).Attributes["href"].InnerText;
                    description = items[i].SelectSingleNode("atom:content", 
							mgr).InnerText;
                    author = items[i].SelectSingleNode("//atom:name", mgr).InnerText;
                    pubDate = items[i].SelectSingleNode("atom:issued", mgr).InnerText;
                    xmlWriter.WriteStartElement("item");
                    xmlWriter.WriteElementString("title", title);
                    xmlWriter.WriteElementString("link", link);
                    xmlWriter.WriteElementString("pubDate", 
			Convert.ToDateTime(pubDate).ToUniversalTime().ToString
			(@"ddd, dd MMM yyyy HH:mm:ss G\MT"));
                    xmlWriter.WriteElementString("author", author);
                    xmlWriter.WriteElementString("description", description);
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();
                xmlWriter.Flush();
                xmlWriter.Close();
            }
            XmlDocument retDoc = new XmlDocument();
            string outStr = Encoding.UTF8.GetString(memoryStream.ToArray());
            retDoc.LoadXml(outStr);
            retDoc.Save("c:\\gova.xml");
            memoryStream.Close();
            xmlWriter.Close();
            return outStr;
        }
//

关注点

我只尝试提取标题、描述、时间、作者和链接。您可以随时扩展它。我还尝试保存转换后的内容。如果您愿意,可以删除代码中的该语句。

历史

  • 2007年10月24日:初始发布
© . All rights reserved.