Posts Tagged ‘ROME’

Open source RSS Library – ROME

5월 27, 2008

RSS 공개 라이브러리인 ROME에 대해 잠시 살펴보자. ROME는 Open Source로 https://rome.dev.java.net/ 에서 관련 정보를 얻을 수 있다.

import java.net.URL;

import java.util.List;

import com.sun.syndication.feed.synd.SyndEntry;

import com.sun.syndication.feed.synd.SyndFeed;

import com.sun.syndication.feed.synd.SyndImage;

import com.sun.syndication.io.SyndFeedInput;

import com.sun.syndication.io.XmlReader;

public class TestRome {

@SuppressWarnings(“unchecked”)

public static void main(String[] args) {

try {

URL feedUrl = new URL(“https://mhjung.wordpress.com/feed”);

SyndFeedInput syndFeedInput = new SyndFeedInput();

XmlReader xmlReader = new XmlReader(feedUrl);

SyndFeed syndFeed = syndFeedInput.build(xmlReader);

System.out.println(“Title: ” + syndFeed.getTitle());

System.out.println(“Link: ” + syndFeed.getLink());

System.out.println(“Description: ” + syndFeed.getDescription());

System.out.println(“Language: ” + syndFeed.getLanguage());

System.out.println(“PublishedDate: ” + syndFeed.getPublishedDate());

if (syndFeed.getImage() != null) {

SyndImage image = syndFeed.getImage();

System.out.println(“Image Title: ” + image.getTitle());

System.out.println(“Image Url” + image.getUrl());

System.out.println(“Image Link” + image.getLink());

}

List<SyndEntry> entries = syndFeed.getEntries();

for (SyndEntry entry : entries) {

System.out.println(“[Entry]”);

System.out.println(“Title: ” + entry.getTitle());

System.out.println(“Link: ” + entry.getLink());

System.out.println(“Uri: ” + entry.getUri());

System.out.println(“Description: ” + entry.getDescription().getValue());

if(entry.getCategories().size() > 0) {

System.out.println(“Category: ” + entry.getCategories().get(0));

}

System.out.println(“PublishedDate: ” + entry.getPublishedDate());

}

} catch (Exception ex) {

ex.printStackTrace();

System.out.println(“ERROR: ” + ex.getMessage());

}

}

}

Feed에서 값을 얻어올 때에는 null 값에 유의해야 한다. 예를 들어 syndFeed.getImage()가 null을 반환하면 syndFeed.getImage().getTitle()을 호출 할 경우 nullPointException이 발생하므로 값을 처리할때에는 꼭 null 값을 반환하는지 확인을 해야한다. 그리고 syndFeed.getEntries().getCategories() 메소드의 경우에는 값을 갖지 않아도 객체는 생성되기 때문에 size를 확인 해야 한다. 이처럼 유의해야 할 사항이 많기 때문에 Feed의 값을 다룰때에는 반환값을 충분히 숙지하고 사용해야 한다.

  • PostScript

현재 EUC-KR 인코딩을 사용하여 서비스하는 피드는 모두 오류가 발생한다는 이슈가 있어 확인해 보았지만 같은 ROME 버전으로 테스트 해 본 결과 EUC-KR 로 사용하는 서비스도 모두 정상적으로 동작하였다. 해당 이슈는 Soulcarta’s Home 에서 확인 할 수 있다.

구글에서 제공하는 RSS의 경우 권한 없음을 알리는 403 코드가 돌아온다. 이 문제는 URL 대신 URLConnection을 사용하여 해결할 수 있다. URLConnection을 사용하여 User-Agent의 값을 자신의 응용프로그램의 이름이나 application/rss+xml 또는 text/xml 와 같이 자신이 처리할 형태를 표시해 주면 된다. 직접 확인해 보지는 않았지만 java.net.URL 대신 org.apache.commons.httpclient 패키지를 사용하여 해결 할 수도 있다고 한다.

URL feedUrl = new URL(“https://mhjung.wordpress.com/feed&#8221;);

위 코드를 다음과 같이 수정하면 된다.

URLConnection feedUrl = new URL(“http://news.google.co.kr/?output=rss&#8221;).openConnection();
feedUrl.setRequestProperty(“User-Agent”, “Hee’s RSS Reader”);

ROME가 지원하는 형식 : rss_2.0, rss_0.91N, rss_0.93, rss_0.92, rss_1.0, rss_0.94, rss_2.0,
rss_0.91U, rss_0.9, atom_1.0, atom_0.3