关于RSS的聚合---OPML
关键字: rss,opml
OPML也是最近才发现的一个东东,以前只知道解析Rss,前几天老总问我要这个东西的时候我才知道,还有OPML的存在。
什么是OPML呢?说白啦,就是把你的网站的RSS聚合在一起生成的一个OPML文件,主要也就是方便RSS文件的提交。
对OPML还没有做太深入的理解,在网上查了查,发现没有那个开源项目可以用的,有Jakarta下的一个开源项目可以使用(FeedParser),可是好像是项目还没有完成啦,在Apache里没有找到下载。还有一个Informa也可以做,不过从2004年之后就没有组织再对其进行更新和维护啦。
想来想去决定用FreeMarker做去,以模板的形式生成一个opml.ftl模板文件。模板文件如下:
完成所需要的模板文件后,就要对模板文件进行生成啦。我使用的技术是Struts2+Spring+Hibernate+Dwr实现的,生成文件的那点是使用Dwr去实现的。具体的生成代码如下:
上面方法中的参数是通过Dwr传递过来的,下面是页面JSP文件:
什么是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(