关于RSS的聚合---OPML

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

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

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

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

 

  
   ${title} 
   ${pubDate} 
   ${owner} 
   ${email} 
   ${title} 
   ${builder} 
   ${link} 
  
  
  
    <#list typeList as type>
      
     
   
  




完成所需要的模板文件后,就要对模板文件进行生成啦。我使用的技术是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 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"%>


 
  信源管理
  
  
  
  
  
 
 
  
类别名称


OPML是对Rss资源的整合,避免了反复提交Rss文件所带来的负担,从而提高Rss的可收录度,相信不久以后OPML和Rss可以更完美的结合,人们可以更好的使用Rss资源。

你可能感兴趣的:(DWR,Linux,项目管理,Spring,freemarker)