什么是OPML呢?说白啦,就是把你的网站的RSS聚合在一起生成的一个OPML文件,主要也就是方便RSS文件的提交。
对OPML还没有做太深入的理解,在网上查了查,发现没有那个开源项目可以用的,有Jakarta下的一个开源项目可以使用(FeedParser),可是好像是项目还没有完成啦,在Apache里没有找到下载。还有一个Informa也可以做,不过从2004年之后就没有组织再对其进行更新和维护啦。
想来想去决定用FreeMarker做去,以模板的形式生成一个opml.ftl模板文件。模板文件如下:
${title} ${pubDate} ${owner} ${email} ${title} ${builder} ${link}<#list typeList as type> #list>
完成所需要的模板文件后,就要对模板文件进行生成啦。我使用的技术是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); ListtypeList = 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资源。