leves

使一切更加简单!

导航

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

 

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


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


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


1:管理员设置栏目布局



2:管理录入相应的RSS聚合信息



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



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


             

               4:用户定义自己的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()处理,否者会丢失对象。

   相关文章:

posted on 2005-12-13 11:26  leves  阅读(2210)  评论(2编辑  收藏  举报