『 天道酬勤 』 www.LiTianping.com 李天平的博客

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  146 随笔 :: 18 文章 :: 2242 评论 :: 83 引用

     如见Web2.0被吵的如火如荼,同时也有很多的评论褒贬不一。有人说Web2.0就是“一帮人在看皇帝的新装而已”。也有人说Web2.0将是一场变革。无论这些争论有没有价值,但我相信,存在就有它的必然性。也许Web2.0更像是一种商业模式,一个观念的变革而非技术。
     不管怎样,它来了,你准备好了吗?
     说到Web2.0,就会提到Blog、TAG、SNS、RSS、wiki这些软件应用和xml、ajax等这些新理论和技术实现。
RSS毋容置疑就是其重要的应用之一。

     那么什么是RSS?它到底有什么用呢?

     RSS是站点与站点之间共享内容的一种简易方式(也称为“聚合内容”),通常被用于新闻和其他按顺序排列的网站,例如Blog网站。网站提供RSS输出,有利于让用户发现网站内容的更新。网站用户可以在客户端借助于类似新闻资讯阅读器等支持RSS的新闻聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。
     RSS是基于XML的一种形式。并且所有的RSS文件都要遵守万维网联盟(W3C)站点发布的XML 1.0规范。具体格式可以查一下RSS 2.0规范,这里就不再重复粘贴了。

下面是我总结的几种RSS的技术实现代码:

1.在线生成RSS聚合页

(1)创建Rss.aspx
<%@ Page language="c#" Codebehind="Rss.aspx.cs" AutoEventWireup="false" Inherits="LiTianPing.Rss" %>
只留下这一行,其余的都删掉。

(2)后台代码;Rss.aspx.cs

  private void Page_Load(object sender, System.EventArgs e)
  {    
   Response.ContentType="text/xml";
   Response.Write(GetRSS());
  }

  /// <summary>
  /// 取得聚合文章
  /// </summary>
  /// <returns></returns>
  public string GetRSS()
  {
   News t=new News();//自己的业务类
   DataSet ds=t.GetListByClass(1);//根据类别得到数据
   
   StringBuilder strCode=new StringBuilder();
   strCode.Append("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>");
   strCode.Append("<rss version='2.0' xmlns:dc=\"http://purl.org/dc/elements/1.1/\"");
   strCode.Append(" xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\" ");
   strCode.Append(" xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:slash=\"http://purl.org/rss/1.0/modules/slash/\">");
   strCode.Append("<channel>");
   strCode.Append("<title>李天平RSSDemo</title>");
   strCode.Append("<link>http://"+Request.ServerVariables["SERVER_NAME"]+"</link> ");
   strCode.Append("<description>天道酬勤</description> ");  
   strCode.Append("<copyright>Copyright 2005</copyright> ");      
   
   foreach(DataRow row in ds.Tables[0].Rows)
   {
    string Id=row["Id"].ToString();
    string title=row["title"].ToString();
    string description=row["description"].ToString();
    string pubdate=row["pubdate"].ToString();
    string ClassId=row["ClassId"].ToString();
    //string author=row["author"].ToString();

    strCode.Append("<item>");
    strCode.Append("<title>"+title+"</title>");
    strCode.Append("<link>http://"+Request.ServerVariables["SERVER_NAME"]+"/NewsShow.aspx?ID="+Id+"</link>");
    strCode.Append("<subject>"+description+"</subject>");
    strCode.Append("<description><![CDATA["+description+"]]></description>");    
    strCode.Append("<PubDate>"+pubdate+"</PubDate>");
    strCode.Append("<category>"+ClassId+"</category>");
    strCode.Append("</item>");    
   }
   strCode.Append("</channel>");
   strCode.Append("</rss>");  
   return strCode.ToString();
  }

 (3) XmlTextWriter实现方式2;Rss.aspx.cs

  string xmlDoc="rss.xml"; 
 private void Page_Load(object sender, System.EventArgs e)
  {    
   xmlDoc=Server.MapPath(".")+xmlDoc;   
   GetRSS2();
   XmlDocument doc= new XmlDocument();
   doc.Load(xmlDoc);
   Response.ContentType = "text/xml";
   doc.Save(Response.Output);
  }
  /// <summary>
  /// 取得聚合文章
  /// </summary>
  /// <returns></returns>
  public void GetRSS2()
  {
   News t=new News();
   DataSet ds=t.GetListByClass(1);
   
   XmlTextWriter writer = new XmlTextWriter(xmlDoc,Encoding.UTF8);
   writer.Formatting = Formatting.Indented;
   writer.WriteStartDocument(true);
   writer.WriteComment("RSS页的实现");
   writer.WriteStartElement("rss");
   writer.WriteAttributeString("version","2.0");      
   writer.WriteStartElement("channel");   
   writer.WriteStartElement("title");
   writer.WriteString("李天平RSSDemo");
   writer.WriteEndElement();
   writer.WriteStartElement("link");   
   writer.WriteString("http://"+Request.ServerVariables["SERVER_NAME"]);
   writer.WriteEndElement();   
   writer.WriteStartElement("description");
   writer.WriteString("天道酬勤");
   writer.WriteEndElement();
   writer.WriteStartElement("copyright");
   writer.WriteString("Copyright 2005");
   writer.WriteEndElement();
   writer.WriteStartElement("language");
   writer.WriteString("zh-cn");
   writer.WriteEndElement();  
      
   foreach(DataRow row in ds.Tables[0].Rows)
   {
    string Id=row["Id"].ToString();
    string title=row["title"].ToString();
    string description=row["description"].ToString();
    string pubdate=row["pubdate"].ToString();
    string ClassId=row["ClassId"].ToString();
    //string author=row["author"].ToString();

    writer.WriteStartElement("item");
    writer.WriteStartElement("title");
    writer.WriteString(title);
    writer.WriteEndElement();
    writer.WriteStartElement("link");
    writer.WriteString("http://"+Request.ServerVariables["SERVER_NAME"]+"/NewsShow.aspx?ID="+Id) ;
    writer.WriteEndElement();
    writer.WriteStartElement("description");
    writer.WriteCData(description);
    writer.WriteEndElement();
    writer.WriteStartElement("pubDate");
    writer.WriteString(pubdate);
    writer.WriteEndElement();
    writer.WriteStartElement("category");
    writer.WriteString(ClassId);
    writer.WriteEndElement();
    writer.WriteEndElement();  
   }
   writer.WriteEndElement();
   writer.WriteEndElement();
   writer.Flush();
   writer.Close();
 
  }
2.在线RSS阅读获取。

页面代码:
  <P style="FONT-SIZE: 11px">
   Feed种子:<asp:TextBox id="FeedUrl" runat="server" Width="440px"></asp:TextBox><BR>
   显示条数:<asp:TextBox id="Num" runat="server" Width="48px"></asp:TextBox></P>
  <P style="FONT-SIZE: 11px">
   <asp:Button id="GetFeed" runat="server" Text="获得RSS"></asp:Button><BR>
   <BR>
   <asp:Label id="RssFeed" runat="server"></asp:Label></P>

后台代码:
  /// <summary>
  /// 获得要显示的Feed种子数据
  /// </summary>
  /// <param name="RssUrl"></param>
  /// <param name="showNewsCount"></param>
  /// <returns></returns>
  public string LoadRSS(string RssUrl, int showNewsCount)
  {
   string strRssList = "";
   string strMsg;
   try
   {      
    XmlDocument objXMLDoc = new XmlDocument();   
    objXMLDoc.Load(RssUrl);  
    XmlNodeList objItems = objXMLDoc.GetElementsByTagName("item");    
  
    if(showNewsCount > 30)
     showNewsCount = 10;  
    if(showNewsCount < 1)
     showNewsCount = objItems.Count;
  
    string title="";
    string link=""; 
    int i;

    if(objXMLDoc.HasChildNodes == true)
    {
     i = 1;
        foreach(XmlNode objNode in objItems)
     {
      if(i<=showNewsCount)
      {
       if(objNode.HasChildNodes == true)
       {
        XmlNodeList objItemsChild = objNode.ChildNodes;
        foreach(XmlNode objNodeChild in objItemsChild)
        {
         switch(objNodeChild.Name)
         {
          case "title":
           title = objNodeChild.InnerText;
           break;
          case "link":
           link = objNodeChild.InnerText;
           break;          
         }         
        }
        i = i+1;
        strRssList += "<a href=" + link +" target=_blank>" + title + "</a><br>"; 
       }      
      }
     }       
    }
    strMsg = strRssList;
   }
   catch
   {
    strMsg = "RSS Feed 源数据出错!";
   }
   return strMsg;
  }

  //获取按钮,获取指定RSS
  private void GetFeed_Click(object sender, System.EventArgs e)
  {
   if(FeedUrl.Text == "")//RSS地址
   {
    RssFeed.Text = "信息源不能为空,您可刷新重试或联系管理员!";
    return ;
   }  
   RssFeed.Text = LoadRSS(FeedUrl.Text,Convert.ToInt32(Num.Text)); //获取指定数目 
  }

3.无刷新动态更新的在线RSS阅读获取

<%@ Page language="c#" Codebehind="XmlHttp.aspx.cs" AutoEventWireup="false" Inherits="LiTianPing.XmlHttp" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
 <HEAD>
  <title>XmlHttp</title>
  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
  <meta name="CODE_LANGUAGE" Content="C#">
  <meta name="vs_defaultClientScript" content="JavaScript">
  <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  <style>td { font-size: 9pt}
  </style>
  <script>
  <!-- 
  var oDiv
  var xh    
  function getXML()
  {   
   xh =new ActiveXObject("Microsoft.XMLHTTP");
   oDiv = document.getElementById("rssitem");
   oDiv.style.display= "";
   try
   {
    //如果是本地改成下面语句直接读取
    //xh.open("GET","/Rss.aspx",false);    
    xh.open("GET","Http://ltp.cnblogs.com/Rss.aspx",false);
    xh.send(null);
    loadData(xh,oDiv);
   }
   catch(e)
   {
    error(oDiv);
   }
  }
  function loadData(xh,oDiv)
  {
   if (xh.readyState == 4)
   {
    xml = xh.responsexml;
    var i;
    var nodes = xml.selectNodes("/rss/channel/item");
    var bloglink = xml.selectSingleNode("/rss/channel/link").text;
    oDiv.innerHTML = "";
    var html;    
    for(i=0;i<nodes.length;i++)
    {    
        
      html += "<div >";
      html += "    <div >";
      html += "        <a class=font1 href='" +nodes[i].selectSingleNode("link").text + "' target='_blank'>" + nodes[i].selectSingleNode("title").text +"</a><BR><BR>";
      html += "    </div>";
      html += "    <div >";
      html += "        " +nodes[i].selectSingleNode("description").text;
      html += "    </div>"           
      //html += "    </div>";
      html += "</div><hr>";

    }
    oDiv.innerHTML = html;
   }
   else
   {
    error(oDiv);
   }
  }

  function error(oDiv)
  {
   oDiv.innerHTML = "载入失败";
  }
  -->
  </script>
 </HEAD>
 <body MS_POSITIONING="GridLayout" onload="window.setTimeout('getXML()',200);">
  <form id="Form1" method="post" runat="server">
   <div align=center>
   <table cellpadding="0" cellspacing="0" border="0" width="80%">
    <tr>
     <td>
      <div id="rssitem" style="WIDTH:80%">数据载入中...</div>
     </td>
    </tr>
   </table>
   </div>
  </form>
 </body>
</HTML> (作者:李天平    转载请注明)


posted on 2006-01-15 21:13 李天平 阅读(7858) 评论(29)  编辑 收藏 网摘 所属分类: ASP.NET开发

评论

#1楼  2006-01-16 01:06 Wuvist [未注册用户]
误人子弟啊!害人不浅啊~
怎么可以用string builder去拼xml?纯粹瞎搞……
用XMLDocument!!!!!!!!!

  回复  引用    

我不觉得楼主这个地方用string builder有什么不妥,呵呵
  回复  引用    

#3楼  2006-01-16 07:11 musicllm [未注册用户]
考虑到性能的问题,用stringbuilder,再者用xmldocument这里并不见得好多少,反而降低代码可读性,主管的看法
  回复  引用    

@Wuvist ,用StringBuilder 如何不妥?请多指教!
  回复  引用    

#5楼  2006-01-16 09:52 headchen      
用StringBuilder没有什么不妥,相对于XmlDocument是好的选择。但有更好的选择:XmlWriter。就是专门用来满足这样的要求的。
  回复  引用  查看    

#6楼  2006-01-16 09:54 THIN      
XmlDocument应不致于有大量性能损失吧,有一个好处,就是强类型,减少出错的机率,用StringBuilder也没什么不好,只是以后修改和查看代码会麻烦一点(如果逻辑比较复杂的话)
  回复  引用  查看    

#7楼  2006-01-16 10:05 Ariel Y.      
好些时候,目的都达到了,但是路都不一样,有的是正路,有的是弯路。

不过,没有最好的,只有最合适的。

这么写,放弃了一些扩展性和XML的结构验证问题,但是换来的是性能有些提高吧。

  回复  引用  查看    

#8楼  2006-01-16 10:48 Nick Yao      
写得不错,很适合初学者~~支持楼主~~
不过我个人还是比较喜欢.Text里的那种写法!!

  回复  引用  查看    

#9楼  2006-01-16 11:57 dududu [未注册用户]
好帖!!! 顶!!!!!!!
  回复  引用    

#10楼  2006-01-16 12:39 Walkdan      
StringBuilder的问题是缺乏编码机制,不能输出严格的XML, 比如你输出的Text文字里面包含'<' , '&'等字符, Attribute里面的文字又包含'"'等,用StringBuilder就必须自己编写XMLEncode(), XMLAttributeEncode()函数。另外,上面对Unicode的处理也是不规范的。

推荐使用XMLTextWriter, 这个是规范的做法, 性能也非常好。

  回复  引用  查看    

#11楼  2006-01-16 12:51 摄狼      
用xmlreader应该是更好的选择,StringBuilder不是不可以,但是应该做一些额外的处理,比如<title>李天平RSSDemo</title>这个节点,如果"李天平RSSDemo"的内容是
“论述>符号在.net中的应用”的时候,生成出来的xml文档就不是正确的。

  回复  引用  查看    

#12楼  2006-01-16 13:06 大尾巴狼      
和Walkdan 、摄狼 意见一样。
直接拼接字符串,最后会死的很难看的。
呵呵。。。。。。。

  回复  引用  查看    

#13楼  2006-01-16 13:54 Ariel Y.      
@ Walkdan

不用自己写XMLEncode()吧?System.Web.HttpUtility.HtmlEncode()就可以吧?

@ 摄狼

XmlReader能写吗?

  回复  引用  查看    

#14楼  2006-01-16 19:02 Walkdan      
@Ariel Y.
 
XML规范同HTML并不完全一样,我认为用HtmlEncode()来编码XML是不妥的做法。XML在编码上同HTML有些细节不尽相同。

  回复  引用  查看    

#15楼  2006-01-16 20:27 摄狼      
呵呵,失敬失敬,当时没有注意到你就是那个写代码生成器的,代码生成器很好用,谢谢。不过没有关系,我之所以提出来,是因为曾经碰到过这个问题,是使用string 拼起来的,但就是有的出问题。
  回复  引用  查看    

#16楼  2006-01-16 21:00 Ariel Y.      
@Walkdan

确实不太一样,但是我觉得HtmlDecode()来处理如前文提到的XML Text节点,应该是没问题的,如果有问题,欢迎指教。因为我也没有实践过。

我写RSS可不是拼字符串哦,呵呵。

  回复  引用  查看    

#17楼  2006-01-17 10:41 笑语      
StringBuilder会在内存中扩展两倍于自己的空间便于以后扩展,所以性能的增加是以空间的损失为代价的。小数据量用string拼还可以,数据量大了服务器就会承受不了,甚至会报出out of memory的错误。前面提到了,StringBuilder还会有编码的问题。
XmlDocument的性质和StringBuilder就我看来差不多,XmlDocument可以自动编码,但是主要的操作还是在内存中处理。
比较推荐XMLTextWriter的写法,它可以批量把数据写出来,不会造成空间的损失,效率也不低,毕竟写完了也不需要对前面的内容做什么修改

由于前段时间拼XML困惑了很久,而且被大数据量的东西搞得比较被动,所以有感而发或许并不适合这里讨论的内容,海涵海涵

  回复  引用  查看    

#18楼  2006-01-17 10:54 不会飞的鱼      
觉得用Stringbuilder也没什么不好, 只是用XmlWriter更规范一些, 关键是可以利用XmlWriter的一些机制,对输出的文本进行控制
  回复  引用  查看    

#19楼  2006-01-17 11:43 inday      
归根结底还是要用到Stringbuilder来输出,xmlwriter只不过让代码看上去更简介。一套程序用多种方法来实现,很正常的事情,没什么好与不好,不管黑猫白猫,能抓老鼠就是好猫
  回复  引用  查看    

#20楼  2006-01-21 18:54 lovenet [未注册用户]
技术不是目的,只是手段。
  回复  引用    

#21楼  2006-06-22 13:56 深夜醉猫      
不错,很有启发性.
  回复  引用  查看    

#22楼  2006-08-15 19:57 仰天一笑      
很受启发,谢谢搂主
  回复  引用  查看    

回头也试试http://www.85sp.cn
http://www.39sp.com.cn

  回复  引用    

#24楼  2007-02-06 11:02 yoyokee [未注册用户]
看看这个
http://yoyokee.com/demo/ajaxppp.htm

  回复  引用    

#25楼  2007-03-18 21:20 job_2006 [未注册用户]
@Wuvist



李老师不是已经说了:《下面是我总结的几种RSS的技术实现代码》吗?只是总结技术的实现,具体用那种方法好,得看你自己的意愿了,并不是说不能用string builder去拼xml从而导致李老师就不能在这里写出方法。
你说的瞎人不浅太具片面性,年轻人啊不会说话^_^

  回复  引用    

#26楼  2007-03-18 21:22 job_2006 [未注册用户]
上面瞎人不浅应是害人不浅,不好意思^_^
  回复  引用    

#27楼  2008-01-07 16:38 王立斌 [未注册用户]
有不同意见可以提出来嘛,不过提出来是为了帮助别人改正问题.方法需要注意.我们是要与人为善还是要与人为恶??呵呵.
  回复  引用    


发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: