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默认载入前5条RSS聚合,用户可以通过设置选择载入全部RSS聚合信息,或者不载入任何RSS聚合信息。
图4:用户定义自己的RSS聚合设置
图5:最大化后的RSS聚合栏目
由于现在各个内容提供商的RSS信息更新都很快,并且很多内容提供商都是根据用户请求实时生成的RSS聚合。为了保证信息的更新速度,Web Builder在每次用户访问时,都会从远程获取RSS聚合数据。同时像RSS这样的远程XML文件随时都有可能获取失败,或者连接时间过长,而获取每个RSS聚合的时间也有长有短,所以有必要设置异步和超时处理。
示例代码如下:
{
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文件
<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() <= 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()处理,否者会丢失对象。
相关文章: