本以为实现要很复杂,或者说后续处理要比较复杂,结果发现,没那么复杂,简单的调用实现就行了,无非是对获取内容再进行二次分析的时候可能要复杂一点,那样的话,就等同于说从页面抓取内容回来了.:)
其实也没什么,无非就是加上了对获取多个源内容进行二次重新排列(按照时间),本来开始上去就顺手写了个冒泡,后来发现,两个rss都是有序排列的,对有序排列的话,没必要再用冒泡来分析处理,耗费时间,只需要对各个内容对比插入就行了,不记得我下面用的这种叫做什么排序了.:(,也不知道是不是一种排序算法,嘿嘿.
PS:记得好像还有个归并排序,但是貌似要对两个集合等长度的才可以?我下面这个应该是哪种?额,估计是变种.其实还有其他相关功能没有写,例如生成rss源之类的,方法大同小异.
实现代码如下:(中间用到了rome包和jdom包,没有的可以在下面下载一样.)
package com.hmilyld.study;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
/**
* 利用rome和jdom自动分析指定rss源内容的数据,可以按照获取单个与获取多个进行分析
* 并可以对多个源内容的数据进行按日期重新排列
* 可以对方法修改一下,获取多个源内容,方法里面我只测试添加了单个和两个的方法,
* 实现形式一样,无非就是分析,再进行排序的问题.:)
*
* @author Hmilyld
* @home http://www.whylover.com
* @version 1.0
*
*/
public class ReadRSS {
/**
* 读取单个rss源并显示内容
*
* @param url
* @throws Exception
* @return List
*/
@SuppressWarnings("unchecked")
public List feed(String url) throws Exception {
URL address = new URL(url);
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(address));
List list = feed.getEntries();
return list;
}
/**
* 读取多个源并对多个源内内容按照时间不同重新排列rss源内容
*
* @param url1
* @param url2
* @return List
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List feed(String url1, String url2) throws Exception {
URL address1 = new URL(url1);
URL address2 = new URL(url2);
SyndFeedInput input = new SyndFeedInput();
// 分别获取指定rss源内的内容
SyndFeed feed1 = input.build(new XmlReader(address1));
SyndFeed feed2 = input.build(new XmlReader(address2));
List list = new ArrayList();
// 对获取的list进行按日期重新排序
list.addAll(sortListByDate(feed2.getEntries(), feed1.getEntries()));
return list;
}
/**
* 对多个源内容进行快速排序,传入两个list内容,
* 将第一个list作为返回list,由此进行比较第二个list
*
* @param list1
* @param list2
* @return List
*/
private List<object> sortListByDate(List</object><object> list1, List</object><object> list2) {
for (int i = 0; i < list1.size(); i++) {
// 判断如果进行比较集合内没有数据则跳出循环
if (list2.size() == 0) {
break;
}
SyndEntry oldEntry = (SyndEntry) list1.get(i);
SyndEntry newEntry = (SyndEntry) list2.get(0);
int check = oldEntry.getPublishedDate().compareTo(
newEntry.getPublishedDate());
if (check < 0) {
// 进行日期比较,把较大的日期插入到当前集合位置内,并删除list2中所取回的内容
list1.add(i, list2.get(0));
list2.remove(0);
} else if ((i + 1) == list1.size()) {
// 如果list1已经在最后一位,则把list2中剩余内容插入list1内
list1.addAll(list2);
break;
}
}
return list1;
}
/**
* 对多个源内容按照时间前后冒泡排序,效率太低,此方法不推荐使用
*
* @param list
* @return List
* @deprecated
*/
@SuppressWarnings( { "unchecked", "unused" })
private List sortListByDate(List list) {
for (int i = 0; i < list.size(); i++) {
for (int j = i; j < list.size(); j++) {
SyndEntry temp1 = new SyndEntryImpl();
SyndEntry temp2 = new SyndEntryImpl();
SyndEntry entryI = (SyndEntry) list.get(i);
SyndEntry entryJ = (SyndEntry) list.get(j);
int check = entryI.getPublishedDate().compareTo(
entryJ.getPublishedDate());
if (check < 0) {
temp1 = entryI;
temp2 = entryJ;
list.set(i, temp2);
list.set(j, temp1);
}
}
}
return list;
}
/**
* 打印出获取的内容
*
* @param list
*/
@SuppressWarnings("unchecked")
private void print(List list) {
SimpleDateFormat dd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
for (int i = 0; i < list.size(); i++) {
SyndEntry entry = (SyndEntry) list.get(i);
System.out.println(entry.getAuthor());
System.out.println(entry.getTitle());
System.out.println(dd.format(entry.getPublishedDate()));
SyndContent syndContent = entry.getDescription();
System.out.println(syndContent.getValue());
System.out.println("------------------------------------");
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
ReadRSS r = new ReadRSS();
String url1 = "http://news.baidu.com/ns?word=%D5%C5%D1%A7%D3%D1&tn=newsrss&sr=0&cl=2&rn=20&ct=0";
String url2 = "http://news.baidu.com/ns?word=%C1%F5%B5%C2%BB%AA&tn=newsrss&sr=0&cl=2&rn=20&ct=0";
// r.feed(url1);
List list = r.feed(url1, url2);
r.print(list);
}
}