관심이 있는 블로그의 RSS를 한 곳으로 몰아서 볼 수 있도록 페이지를 구성했다.
왜냐하면 그런 RSS리더 프로그램들은 많이 있지만, 내 손으로 만들어 보고 싶기도 했고, 또 한 번 만들어 놓으면 다르게 유용하게 쓰일 수 있을 것 같아서였다.
하지만, 문제는 RSS파싱이이었다.
자바에는 기본적으로 XML을 파싱할 수 있는 라이브러리를 제공해주고 있다.
지금까지 그 라이브러리를 사용했었고, 또 문제가 된적도 없었다. 하지만 이번에 여러 블로그를 파싱하려고 보니 특정 블로그에서 파싱이 잘 되지 않는 문제가 발생했다. 원인은 아직도 잘 모른다. 검색의 신도 잘 알려주지 않았다.
그래서 예전에 본 JDOM을 찾아보기로 했다. 사용해 본적은 없지만 많은 사람들이 JDOM을 사용하고 있다는 것은 이미 알고 있었다. 그래서 자료를 찾아봤다.
아래는 JDOM을 이용하여 XML(RSS)을 파싱하는 간단한 예이다.
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;
public List<RssPost>parseRss(String rssURL){
URL url = null;
ArrayList<RssPost> rssList = new ArrayList<RssPost>();
try{
SAXBuilder parser = new SAXBuilder();
parser.setValidation(false);
parser.setIgnoringElementContentWhitespace(true);
url = new URL(rssURL);
InputSource is = new InputSource(url.openStream());
doc = parser.build(is);
Element root = doc.getRootElement();
Element channel = root.getChild("channel");
List list = channel.getChildren("item");
Element title = channel.getChild("title");
String blog_title = title.getText();
for(int i=0; i<list.size(); i++){
Element el = (Element)list.get(i);
String item_title = el.getChildText("title");
String item_link = el.getChildText("link");
String item_pubDate = el.getChildText("pubDate");
RssPost post = new RssPost();
post.setAddress(item_link);
post.setBlogname(blog_title);
post.setTitle(item_title);
post.setWdate(item_pubDate);
post.setRsslink(rssURL);
rssList.add(post);
}
}catch(Exception e){
e.printStackTrace();
}
return rssList;
}
자바에서 기본적으로 제공해주는 것보다 간결하고 코드도 깔끔하다.
다음은 이 라이브러리를 가지고 만든 RSS 모음 사이트이다.
http://dantes98.cafe24.com/main/rssPostList.dan
문제는 각각의 블로그를 읽어 내용을 파싱하고 내 디비에 넣어야 하는데, 주기적으로 할 수 없다는 것이다.
cafe24에 호스팅을 받고 있는데, cron을 지원을 하고 있지 않다.
rss 업데이트 할 수 있는 페이지를 별도로 만들어 놓았지만, 직접 호출해야 한다. ㅡㅡ;
다른 방법을 찾아 보아야 겠다.
JDOM은
이곳에서 자세한 내용을 확인할 수 있다.