개인 프로젝트에서 사용할 RSS Reader가 필요해서 "직접 만들어볼까?" 하고 잠시 고민을 하다가 "너 그만큼 실력 안되잖아?"라는 자아의 소리를 듣고 인터넷을 뒤졌습니다. [Open Source RSS & RDF Tools in Java]라는 아름다운 사이트를 발견했고 그 중에서 Rome이라는 놈이 예쁘다는걸 알게되었습니다. rome-1.0.jar를 받아서 lib에 추가를 하니 필요한 lib가 하나 더 있더군요. 바로 jdom인데 jdom-1.1.1.zip을 받아서 lib에 추가를 해줬습니다. 그랬더니 정상적으로 실행이 되었고 티스토리, 다음, 네이버 블로그에서는 Feed를 정상적으로 읽어 왔습니다.
package rtong.rss;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
public class RssReaderTest {
private static String url ="http://feeds.feedburner.com/rtong";
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
URL feedUrl = new URL(url);
SyndFeedInput input = new SyndFeedInput();
SyndFeed syndFeed = input.build(new XmlReader(feedUrl));
/*RSS*/
System.out.println("### getFeedType [" + syndFeed.getFeedType() +"]");
System.out.println("### getLanguage [" + syndFeed.getLanguage() +"]");
System.out.println("### getTitle [" + syndFeed.getTitle() +"]");
System.out.println("### getPublishedDate [" + syndFeed.getPublishedDate() +"]");
List<SyndEntry> entries = syndFeed.getEntries();
SyndEntry entry = null;
/*발행정보*/
for(int i=0, j=entries.size(); i<j ; i++) {
entry = entries.get(i);
System.out.println("### getTitle [" + entry.getTitle() +"]");
System.out.println("### getUri [" + entry.getUri() +"]");
System.out.println("### getDescription [" + entry.getDescription().getValue() +"]");
System.out.println("### getPublishedDate[" + entry.getPublishedDate().getTime() +"]");
/*카테고리*/
StringBuffer cate = new StringBuffer();
if(entry.getCategories()!=null && entry.getCategories().size()>0){
for(int ii=0,jj=entry.getCategories().size(); ii<jj; ii++){
SyndCategoryImpl ss = (SyndCategoryImpl)entry.getCategories().get(ii);
cate.append(CommonUtils.replace(ss.getName(), " ", "") ).append(",");
}
}
System.out.println("### category [" + cate.toString() +"]");
}
}
}
오픈소스를 이용하니 이렇게 간단하게 끝납니다. 근데 이걸 미련스럽게 혼자서 처음부터 다 만들려고 했다면 내년까지 RSS 읽어오는 부분을 하고있을 것 같네요.(그래도 버그 있고.. 호환성 문제 생기고 그러겠죠...) 세상의 모든 오픈소스에 감사합니다
우선 위 소스 정도면 제가 원하는 정보를 다 가지고 옵니다. 하지만 사소한 문제가 하나 있습니다. description(발행한 글 본문)을 가져올때 본문의 태그까지 모조리 가져오는데 제게 필요한건 태그가 포함된 본문 전체가 아니라 텍스트만 필요하기 때문입니다. 해서 "태그 빼고 글자만"이라고 검색을 해보니 PHP에는 strip_tags라는 함수가 있는 것 같더군요. 해서 이리 저리 검색을 해보니 복잡하게 구현된 것도 있었지만 제가 원하는 결과물은 나오지 않았습니다. 그러다 구글링을 통해 놀라온 소스를 발견했지요. @@ 단 일곱줄로 제가 원하는 기능을 구현해 놓은 겁니다. (replaceAll 안의 정규식은 무슨 의미인지 모르겠네요.)
public static String stripTags(String text) {
if (text != null) {
return text.replaceAll("\\<.*?>","").trim();
} else {
return "";
}
}
위 전체 소스에서 entry.getDescription().getValue()를 stripTags(entry.getDescription().getValue())로만 해주면 태그는 빼고 사용자가 직접 입력한 내용만 추출됩니다. 오늘은 위 내용을 DB화 하는 부분을 구현하면 되겠습니다. 혹시 문제가 있는 부분이 발견되면 말씀해주세요 ^^;;