WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器

 

        透过RSS (Rich Site Summary )技术,Web Builder可以从最热门的门户网站获得最新的新闻的站点。股票价格,天气信息,新闻,线式讨论组,软件发布……所有这一切都将被动态更新,每小时一次,不需要任何手工干预。


        同时
Web Builder也会发布自己的RSS输出,这样可以让其他新闻聚合工具(例如RSS阅读器)web站点,很容易找到自己的内容,并自动获得更新。


        首先,管理员添加一个
RSS类型的栏目到站点中,并设置好该栏目的位置,录入相应的信息,如RSS来源的名称,RSS地址等信息,Web Builder将自动从远程获取相应的RSS聚合数据,并将这些数据通过XSLT转换呈现到网页上。

WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器
1:管理员设置栏目布局


WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器
2:管理录入相应的RSS聚合信息



WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器

                   3:根据管理员设置,Web Builder载入相应的RSS聚合



       
Web Builder
默认载入前5RSS聚合,用户可以通过设置选择载入全部RSS聚合信息,或者不载入任何RSS聚合信息。


              WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器

               4:用户定义自己的RSS聚合设置


          WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器         

        5:最大化后的RSS聚合栏目


             

           由于现在各个内容提供商的RSS信息更新都很快,并且很多内容提供商都是根据用户请求实时生成的RSS聚合。为了保证信息的更新速度,Web Builder在每次用户访问时,都会从远程获取RSS聚合数据。同时像RSS这样的远程XML文件随时都有可能获取失败,或者连接时间过长,而获取每个RSS聚合的时间也有长有短,所以有必要设置异步和超时处理。

示例代码如下:

 

public     void  getRss() 

         
{
              
try
              
{

                   
//取得远程地址
                    
Uri HttpSite = new Uri( getRssUrl(this.ID));
                     HttpWebRequest wreq 
= (HttpWebRequest) WebRequest.Create(HttpSite);              
                     IAsyncResult r 
= (IAsyncResult) wreq.BeginGetResponse(new AsyncCallback(RespCallback), wreq);              
                     System.Threading.ThreadPool.RegisterWaitForSingleObject(r.AsyncWaitHandle,
                                                                                    
new System.Threading.WaitOrTimerCallback(TimeoutCallback),
                                                                                    wreq,
                                                                                    
1000,
                                                                                    
true);
                 allDone.WaitOne();         
                        
              }


              
catch(Exception e)
              
{
                   PrtData.Text 
="读取rss文件失败";
              }
           

         }


         
// 用xslt转化rss
          private   void  RespCallback(IAsyncResult ar)
         
{
              
try
              
{
                   
//建立一个http请求
                   HttpWebRequest req = (HttpWebRequest) ar.AsyncState;
                   HttpWebResponse resp 
= (HttpWebResponse) req.EndGetResponse(ar);
                   
//rss文件编码一般为utf8
                   StreamReader Reader = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.UTF8);
                   String respHTML 
= Reader.ReadToEnd();                        
                   
string strXml= respHTML.ToString();
                   XmlDocument doc 
= new XmlDocument();
                   doc.LoadXml(strXml);

                   
//建立一个xslt样式转化
                   XslTransform xslt = new XslTransform();
                   xslt.Load(Server.MapPath(strXsltUri));
                   StringWriter writer 
= new StringWriter();
                   xslt.Transform(doc,
null, writer, null);
                   PrtData.Text 
= writer.ToString();
              }


              
catch(Exception e)
              
{
                   PrtData.Text 
="转换远程数据失败";             
              }
            
              allDone.Set();
         }


 

private    void  TimeoutCallback( object  state,  bool  timedOut) 
         

              
//超时的处理
         }


 

        转换RSS的XSLT文件        

<? xml version="1.0" encoding="utf-8"  ?>
< xsl:stylesheet  version ="1.0"  xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"  
xmlns:msxsl
="urn:schemas-microsoft-com:xslt"  
xmlns:WebBuilder
="WebBuilder"
 exclude-result-prefixes
="WebBuilder" >     
    
    
< msxsl:script  language ="javascript"  implements-prefix ="WebBuilder" >
        
<![CDATA[  
        function parseDate(strDate)
        {
            var dateObj = new Date(strDate);
            var mydate = dateObj.getYear()+"-"+(dateObj.getMonth()+1)+"-"+dateObj.getDate();            return mydate;    
        }
        
]]>
    
</ msxsl:script >
    
< xsl:template  match ="/" >         
        
< table  id ="rssImglist"   width ="100%"   >
        
< tr  class ="subTitle" >< td  width ="20" ></ td >< td > 标题 </ td >< td > 时间 </ td ></ tr >
            
< xsl:for-each  select ="rss/channel/item[position() &lt;= 5]" >     
                
< xsl:sort  select ="pubDate"  order ="descending"   />
                
< TR >
                
< td >< img  src ="images/ico_rss.gif"  alt ="rss" ></ img ></ td >
                    
< TD  >
                        
< A >
                            
< xsl:attribute  name ="href" >
                                
< xsl:value-of  select ="link"   />
                            
</ xsl:attribute >
                            
< xsl:attribute  name ="target" >  _blank  </ xsl:attribute >
                            
< xsl:value-of  select ="title"   />
                        
</ A >
                    
</ TD >
                    
< TD  class ="txtTime"  width ="100" >                 
                        
< xsl:variable  name ="pubDate"   select ="pubDate"   />                                      < xsl:value-of  select ="WebBuilder:parseDate(string($pubDate))"   />                      </ TD >
                
</ TR >
            
</ xsl:for-each >
        
</ table >
    
</ xsl:template >
</ xsl:stylesheet >



        由于RSS文件的文章发布时间大多数为(GMT)格林威治标准时间,所以应该用msxsl:script将时间转化为本地时间,需要注意的是在传递参数到script函数时需要先将参数作string()处理,否者会丢失对象。

   相关文章:

你可能感兴趣的:(Web)