`

关于RSS的聚合---OPML

阅读更多
  OPML也是最近才发现的一个东东,以前只知道解析Rss,前几天老总问我要这个东西的时候我才知道,还有OPML的存在。

  什么是OPML呢?说白啦,就是把你的网站的RSS聚合在一起生成的一个OPML文件,主要也就是方便RSS文件的提交。

  对OPML还没有做太深入的理解,在网上查了查,发现没有那个开源项目可以用的,有Jakarta下的一个开源项目可以使用(FeedParser),可是好像是项目还没有完成啦,在Apache里没有找到下载。还有一个Informa也可以做,不过从2004年之后就没有组织再对其进行更新和维护啦。

  想来想去决定用FreeMarker做去,以模板的形式生成一个opml.ftl模板文件。模板文件如下:

<?xml version="1.0" encoding="utf-8" ?> 
<opml version="1.0">
  <head>
   <title>${title}</title> 
   <dateCreated>${pubDate}</dateCreated> 
   <ownerName>${owner}</ownerName> 
   <ownerEmail>${email}</ownerEmail> 
   <description>${title}</description> 
   <createdBy>${builder}</createdBy> 
   <link>${link}</link> 
  </head>
  <body>
  <outline title="${title}" text="${title}" opml="" kind="nkPath">
    <#list typeList as type>
     <outline title="${type.title}" text="${type.title}" type="rss" xmlUrl="${buildPath}/news/rss/${type.typecode}.xml" interval="60" itemMax="400" htmlUrl="" description="${type.title}" kind="nkFeed" /> 
    </#list> 
   </outline>
  </body>
</opml>



完成所需要的模板文件后,就要对模板文件进行生成啦。我使用的技术是Struts2+Spring+Hibernate+Dwr实现的,生成文件的那点是使用Dwr去实现的。具体的生成代码如下:
public String opmlBuild(String typeCode, String fileName, String owner,
   String email, String builder, String link, String buildPath,
   HttpServletRequest request, HttpServletResponse response) {
  String result = "";
  try {
   response.setContentType("text/opml");
   response.setCharacterEncoding("utf-8");
   String ftlPath = request.getSession().getServletContext()
     .getRealPath("/")
     + "//WEB-INF//ftl//";
   String path = request.getSession().getServletContext().getRealPath(
     "/");
   // String ftlPath = ftl + "//ftl//";
   config.setDirectoryForTemplateLoading(new File(ftlPath));
   // 得到模板文件
   Template template = config.getTemplate("opml.ftl");
   // 设置编码格式
   template.setEncoding("utf-8");
   YxNewsType type = typeNews.getTypeByTypeCode(typeCode);
   List<YxNewsType> typeList = typeNews
     .getAllChildTypeByTypeCode(typeCode);
   if (typeList != null) {
    Map root = new HashMap();

  //设置发布的OPML的标题
    root.put("title", type.getTitle());

    //设置OPML的发布时间
    root.put("pubDate", new Date().toString());

    //设置OPML的所有者
    root.put("owner", owner);

  //设置OPML的发布者的EMail地址
    root.put("email", email);

    //设置OPML的创建人
    root.put("builder", builder);

    //设置OPML文件的连接地址,可以直接你网站的连接地址
    root.put("link", link);

  //设置自己的创建Rss的连接地址
    root.put("buildPath", buildPath);
    root.put("typeList", typeList);
    // 设置到生成的文件名称

    String file = "";

  //判断当前操作系统,如果是Windows系统的做就是反斜杠,如果是Linux系统就使用正斜杠
    Properties properties = System.getProperties();
    Object object = properties.get("os.name");
    // System.out.println("当前操作系统:" + String.valueOf(object));
    if ("Windows".equals(String.valueOf(object))) {
     file = path + "\\rss\\opml\\" + fileName + ".opml";
    } else {
     file = path + "//rss//opml//" + fileName + ".opml";
    }

    //设置要生成的文件
    Writer out = new OutputStreamWriter(new FileOutputStream(file),
      "utf-8");
    template.process(root, out);

  //清理写入流
    out.flush();

    // 关闭流文件
    out.close();
    result = "buildSuccess";
   } else {
    result = "noChild";
   }
  } catch (Exception e) {
   result = "error";
   e.printStackTrace();
  }
  return result;
 }

 
上面方法中的参数是通过Dwr传递过来的,下面是页面JSP文件:

<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>信源管理</title>
  <link rel="stylesheet"
   href="${pageContext.request.contextPath}/common/css/admin/style.css"
   type="text/css" />
  <script type="text/javascript"
   src="${pageContext.request.contextPath}/dwr/engine.js"></script>
  <script type="text/javascript"
   src="${pageContext.request.contextPath}/dwr/util.js"></script>
  <script type="text/javascript"
   src="${pageContext.request.contextPath}/dwr/interface/rssBuild.js"></script>
  <script type="text/javascript">
   var typeCode;
   function showBuild(title,code){
    //alert(title);
    typeCode = code;
    var doc = document.getElementById("buildOpml");
    document.getElementById("tableTitle").innerHTML=title;
    document.getElementById("opmlName").value = "";
    document.getElementById("nameMessage").innerHTML = "请以英文名称命名";
    document.getElementById("startBuild").value = "生成OPML";
    doc.style.display = "block";
   }
   function buildOpml(){
    owner = document.getElementById("opmlOwner").value;
    email = document.getElementById("opmlEmail").value;
    builder = document.getElementById("opmlBuilder").value;
    url = document.getElementById("opmlUrl").value;
    fileName = document.getElementById("opmlName").value;
    prefix = document.getElementById("opmlPrefix").value;
    msg = document.getElementById("nameMessage");
    btnBuild = document.getElementById("startBuild");
    if(""!=fileName){
     msg.innerHTML = "<font color='green'>文件生成中,请等待……</font>";
     btnBuild.disabled = true; 
     btnBuild.value = "文件生成中";
     rssBuild.opmlBuild(typeCode,fileName,owner,email,builder,url,prefix,callBackResult);
    }else{
     msg.innerHTML = "<font color='red'>请填写你的OPML文件名称</font>";
    }
   }
   function callBackResult(result){
    msg = document.getElementById("nameMessage");
    btnBuild = document.getElementById("startBuild");
    if(result=="buildSuccess"){
     msg.innerHTML = "<font color='green'>文件已经成功生成</font>";
     btnBuild.disabled = false;
     btnBuild.value = "生成成功";
    }else if(result=="noChild"){
     msg.innerHTML = "<font color='red'>此类别没有子信息,无法生成</font>";
     btnBuild.disabled = false;
     btnBuild.value = "没有子类可供生成";
    }else{
     msg.innserHTML = "<font color='red'>生成出现错误,请联系管理员</font>";
     btnBuild.disabled = false;
     btnBuild.value = "生成失败";
    }
   }
   function showHideDIV(){
    var doc = document.getElementById("buildOpml");
    doc.style.display =(doc.style.display == "none"?"block":"none");
   }
  </script>
 </head>
 <body>
  <div id="container">
   <table class="tableBorder" align="center" border="0" cellpadding="2"
    cellspacing="1" style="width: 98%;">
    <tr>
     <th height="25" colspan="10">
      类别名称
     </th>
    </tr>
    <tr>
     <s:iterator value="listType">
      <td class="TableRow2">
       <a href="javascript:showBuild('${title }','${typecode }');"
        style="text-shadow: none;"> <s:property value="title" /> </a>
      </td>
     </s:iterator>
    </tr>
   </table>
   <div id="buildOpml" style="display:none;">
    <table class="tableBorder" align="center" border="0" cellpadding="2"
    cellspacing="1" style="width: 98%;">
     <tr>
      <th colspan="3">
       <div id="tableTitle"></div>
      </th>
     </tr>
     <tr>
      <td class="TableRow2">请输入OPML的所有者:</td>
      <td class="TableRow2">
       <input type="text" id="opmlOwner" value="中国分告传媒" disabled="disabled"/>
      </td>
      <td class="TableRow2">
       <div id="ownerMessage">请正确填写OPML的所有者</div>
      </td>
     </tr>
     <tr>
      <td class="TableRow2">请输入OPML所有者的联系邮箱:</td>
      <td class="TableRow2">
       <input type="text" id="opmlEmail" value="zyj-jack@163.com"/>
      </td>
      <td class="TableRow2">
       <div id="emailMessage">请正确填写邮箱地址</div>
      </td>
     </tr>
     <tr>
      <td class="TableRow2">请输入OPML创建者的名字:</td>
      <td class="TableRow2">
       <input type="text" id="opmlBuilder" value="河南亿禧软件有限公司" disabled="disabled"/>
      </td>
      <td class="TableRow2">
       <div id="builderMessage">请正确填写创建者</div>
      </td>
     </tr>
     <tr>
      <td class="TableRow2">请输入网站的连接URL:</td>
      <td class="TableRow2">
       <input type="text" id="opmlUrl" value="www.fansgoo.com" disabled="disabled"/>
      </td>
      <td class="TableRow2">
       <div id="urlMessage">请输入合法的网络地址</div>
      </td>
     </tr>
     <tr>
      <td class="TableRow2">请填写您生成文件前缀地址:</td>
      <td class="TableRow2">
       <input type="text" id="opmlPrefix" value="http://www.fansgoo.com" disabled="disabled"/>
      </td>
      <td class="TableRow2">请填写您生成文件所在的位置</td>
     </tr>
     <tr>
      <td class="TableRow2">请输入您的生成的OPML名称:</td>
      <td class="TableRow2"><input type="text" id="opmlName" name="opmlName"/></td>
      <td class="TableRow2"><div id="nameMessage">请以英文名命名</div></td>
     </tr>
     <tr>
      <td class="TableRow2" colspan="3" align="center">
       <input type="button" id="startBuild" value="生成OPML" onclick="buildOpml();"/>
      </td>
     </tr>
    </table>
   </div>
   <br />
   <jsp:include page="admin_bottom.jsp" />
  </div>
 </body>
</html>

OPML是对Rss资源的整合,避免了反复提交Rss文件所带来的负担,从而提高Rss的可收录度,相信不久以后OPML和Rss可以更完美的结合,人们可以更好的使用Rss资源。
分享到:
评论
2 楼 elementstorm 2008-12-19  
顶一个!
1 楼 y263542662 2008-07-18  
分离下把..

相关推荐

    ReadWorld (RSS聚合新闻阅读器)

    欢迎使用ReadWorldRSS阅读器 1 这个程序更改了我上回发布的《聚合新闻(RSS)阅读器》的一些错误。 2 新增了频道列表的拖放功能,及导入,导出(OPML)功能。 3 重新设计了一下界面 4 本程序是仿照《新郎点点通》...

    Gregarius RSS聚合程序 0.6.1.zip

    Gregarius是国外一个RSS聚合程序,免费开源,具备良好的用户体验,易于操作和管理。可以把其当成RSS阅读器使用。 Gregarius是一个RSS/RDF/ATOM新闻聚合器支持OPML导入/导出,XHTML/CSS输出。 Gregarius包含一...

    xna.rar_RSS_XNA_atom_opml_聚合

    国内最好的开源PHP新闻聚合 1.支持RSS多核心切换,默认支持lastrss,simplepie,magpierss 2.支持 RDF,RSS,ATOM feeds 支持智能识别 3.基于浏览器Web端的前台浏览和后台管理,可在前台编辑,删除,锁定相关新闻 4.支持...

    RSS聚合器SismicsReader.zip

    Sismics Reader 是一个 Google ... 支持 RSS 和 Atom 支持分类组织,并跟踪喜好的文章 提供 Web 和移动接口 RESTful Web API 全文搜索 OPML 导入导出 皮肤自定义 Android 应用 标签:Sismics

    建立自己的RSS

    RSS(Really Simple Syndication)是一种用于发布和订阅内容的标准化格式,它允许用户通过RSS阅读器或聚合器获取网站更新,而无需直接访问网站。RSS feed通常包含标题、链接、描述以及发布日期等信息,使得用户可以...

    新浪RSS新闻频道地址统计

    - **RSS源的自动抓取**:应用可以通过解析OPML文件获取RSS源的URL,然后定期抓取这些RSS源的数据。 - **内容展示**:将抓取到的RSS内容以友好的方式展示给用户,支持自定义排序、过滤等功能。 - **离线阅读**:允许...

    Windows Vista 领航系列课程(6):开发基于RSS的应用程序

    - 熟悉RSS订阅和同步机制,例如OPML(Outline Processor Markup Language)用于管理订阅列表。 通过这个课程,开发者将掌握在Windows Vista环境下创建高效、用户友好的RSS应用程序的关键技能,从而提升其软件开发...

    可能吧RSS地址下载

    【可能吧RSS地址下载】与【可能吧RSS输出】这两个标签指向的是关于获取和使用RSS订阅功能的相关知识。RSS(Really Simple Syndication)是一种内容发布和聚合标准,它允许用户订阅并获取网站上的最新更新,而无需...

    opml:Fichiersà进口商Dan选民RSS

    关于“opml-master”这个压缩包文件名称,可能是包含了一个OPML文件示例或者是一个用于演示如何导入OPML的项目。通常,这样的资源可能包括一些OPML文件模板,以及可能的教程或说明文档,帮助用户理解如何操作。 在...

    asp.net下URL网址重写成.html格式、RSS、OPML的知识总结

    RSS 是一种常用的 XML 文件格式,主要用于新闻聚合和其他内容更新的通知。RSS 可以帮助用户快速获取最新的网站更新信息,同时也有助于提高网站的曝光率。 **RSS 文件的基本结构** 一个典型的 RSS 文件应遵循以下...

    swift-RSSAtomJSONFeedRSS-inJSONOPML和HTML的解析器

    Swift中的RSS、Atom、JSON Feed、RSS-in-JSON和OPML解析器是用于处理不同格式的聚合数据流的工具。这些格式通常用于博客、新闻站点和其他定期更新内容的发布,以便用户可以订阅并获取最新信息。本文将详细介绍这些...

    php-rss-feed:PHP平台的Feed订阅客户端

    声明原作者版本: : 汉化版本: : 下载GitHub: : 本站下载: : 界面特征C-LX RSS是另一个基于Web的单用户RSS阅读器。它带有OPML和CronJobs支持。要求必需组件PHP&gt; 5.5和具有PDO支持SQLite(或具有PDO支持MySQL)...

    功能完善的RSS阅读器

    【RSS阅读器】是一种互联网内容聚合工具,它能够帮助用户订阅和管理来自多个网站的RSS(Really Simple Syndication)源,实现新闻、博客更新等信息的一站式获取。基于QT的RSS阅读器则是利用QT库开发的这样一种应用,...

    Atom-brief,Firefox的RSS阅读器扩展。有助于简要说明.zip

    通过RSS阅读器,用户可以聚合多个来源的信息,使得获取新闻、博客文章和其他在线内容变得更加高效。Atom-Brief作为Firefox的扩展,将这种功能集成到浏览器中,使用户在浏览网页的同时,也能轻松地查看和管理订阅的...

    Podget:一个简单的播客聚合器。-开源

    Podget 是一个简单的播客聚合器,针对作为预定的后台作业(即 cron)运行进行了优化,支持类别和文件夹、从 OPML 列表和 iTunes PCAST​​ 文件导入服务器、导出 OPML 文件、自动创建和清理播放列表。 2016 年 6 月 ...

    IXNA聚合程序 v0.5.rar

    国内最好的开源PHP新闻聚合 1.支持RSS多核心切换,默认支持simplepie,...6.支持导入和导出OPML 7.可显示favicon 8.具有多种主题样式,现有default,bxna两套主题 9.支持Rewrite启用 10.生成SiteMAP0.9 11.多语言包

    RSS阅读器 GreatNews

    RSS阅读器的核心功能是帮助用户追踪并聚合他们感兴趣的网站或博客的更新,而无需频繁地手动访问这些网站。 【描述】"RSS阅读器" 提供了一种方便的方式来跟踪你关注的多个网站的最新内容。GreatNews作为其中的一款,...

    RRS地址集合

    在网站开发及信息聚合应用中,RSS(Really Simple Syndication)是一种常用的格式,用于组织和共享网站上的内容更新。本文档汇总了一系列RSS资源地址,这些资源来自于不同的网站,覆盖了新闻、科技、娱乐等多个领域...

    WordPress目录和文件介绍.doc

    - **wp-rss.php**、**wp-rss2.php**:分别生成RSS1.0和RSS2.0的信息聚合,满足不同用户的订阅需求。 - **wp-settings.php**:执行启动前的准备程序,检查安装状态,初始化执行环境。 - **wp-trackback.php**:...

    离线阅读器资源管理器

    综上所述,离线阅读器资源管理器通过RSS聚合和OPML文件的支持,为用户提供了一种便捷、个性化的信息获取和管理方式,让用户能在任何时间、任何地点保持对网络内容的掌控,而无需时刻保持在线状态。

Global site tag (gtag.js) - Google Analytics