Posts Tagged ‘RSS’

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

Advertisements

RSS 구독 목록을 위한 OPML의 사용

5월 21, 2008
  • OPML이란 무엇인가?

OPML은 Outline Processor Markup Language의 약자로서 직역을 하면 ‘개요 처리기를 위한 언어’ 정도로 해석된다. OPML은 서로 다른 운영체제와 환경에서 실행되는 응용프로그램간에 구조화된 개요정보를 교환하기 위한 XML 기반 형식이다라고 Dave Winer는 기술하고 있다. OPML은 원래 Radio UserLand에 의해 Outliner 어플리케이션을 위한 네이티브 파일 형식으로 개발 되었지만 이후 여러가지 다른 용도로 채택 되었다. 가장 공통적으로는 Web Feed와 Web Feed Aggregator 사이의 목록 교환이다. OPML 명세는 outline을 임의적인 요소의 계층적이고 질서 정연한 목록이라고 정의한다. 이 명세는 많은 유형의 목록 데이터를 적합하게 만들기 위해 개방되어 있다.

  • OPML의 활용

OPML은 인터넷 문서 수집을 위한 한 형식으로 그 특성상 RSS와 많이 비슷하고 Blog를 Channel별로 관리 할 수 있기 때문에 현재는 RSS Feed 목록을 교환하기 위한 목적으로 많이 사용되고 있다. 예를 들어 현재 사용하는 RSS 구독 서비스를 다른 RSS 구독 서비스로 교체할 경우 현재 사용하고 있는 구독 서비스에서 Feed의 목록을 OPML 파일을 내보내고 새로 교체 할 서비스에서 내보낸 OPML 파일을 가져오면 손 쉽게 RSS Feed들을 재등록 할 수 있다.

RSS Feed 목록을 교환하기 위해 OPML을 사용한 예를 살펴보자. 아래의 예제는 국내 RSS 구독 프로그램 중 하나인 “연모”라는 구독기에서 OPML 내보내기를 했을때 생성되는 OPML 파일이다.

<?xml version=”1.0″ encoding=”euc-kr”?>

<opml xmlns:xsd=”http://www.w3.org/2001/XMLSchema&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”&gt;

<head>

<title>Generated by Yeonmo – http://www.yeonmo.co.kr</title&gt;

</head>

<body>

<outline title=”Friend”>

<outline type=”rss” title=”Hee’s Weblog” xmlUrl=”https://mhjung.wordpress.com/feed&#8221; htmlUrl=”https://mhjung.wordpress.com&#8221; description=””/>

<outline type=”rss” title=”blog*witch” xmlUrl=”http://softwitch.net/blog/feed&#8221; htmlUrl=”http://softwitch.net/blog&#8221; description=””/>

</outline>

<outline title=”News”>

<outline title=”문화/생활”>

<outline type=”rss” title=”Google 뉴스 한국 – 문화/생활” xmlUrl=”http://news.google.co.kr/?ned=kr&topic=l&output=rss&#8221; htmlUrl=”http://news.google.co.kr/?ned=kr&topic=l&#8221; description=””/>

</outline>

<outline type=”rss” title=”Google 뉴스 한국” xmlUrl=”http://news.google.co.kr/?ned=kr&output=rss&#8221; htmlUrl=”http://news.google.co.kr/?ned=kr&#8221; description=””/>

<outline type=”rss” title=”- Google 뉴스” xmlUrl=”http://news.google.co.kr/?ned=kr&topic=po&output=rss&#8221; htmlUrl=”http://news.google.co.kr/?ned=kr&topic=po&#8221; description=””/>

</outline>

</body>

</opml>

현재 제공중인 OPML 2.0 Draft Spec과 조금 다르기는 하지만 간단하게 OPML이 어떻게 구성되는지 살펴 볼 수 있다. 우선 현재의 2.0 Draft Spec을 기준으로 OPML을 구성하고 있는 Element들에 대해 하나씩 알아보자. OPML 파일은 XML 1.0 형식을 따른다. <opml> 요소는 필수 속성으로 version이라는 속성을 가진다. version의 값은 현재로서는 1.0 또는 2.0이 될 것이지만 만약 1.1이라는 값을 본다면 1.0과 똑같이 다루면 된다. 또한 <opml> 요소는 하위 요소로 반드시 <head>와 <body> 요소를 가져야 한다. <head> 요소는 0개 이상의 하위 요소를 선택적으로 포함 할 수 있는데 RSS를 교환하기 위한 목적으로 사용할 수 있는 요소로는 <title>, <dateCreated>, <dateModified>, <ownerName>, <ownerEmail>, <ownerId>가 있다. 각 요소의 이름만 봐도 사용법을 유추 할 수 있을 것이다. <ownerId>의 경우 OPML 파일을 생성한 소유주의 Email이나 웹 페이지의 주소와 같이 문서의 소유주와 의사 소통 하거나 확인 할 수 있는 유일한 값을 사용한다. <body> 요소는 하나 이상의 <outline> 요소를 포함한다. <outline> 요소는 RSS를 교환하기 위한 목적으로 사용 할 경우 필수적으로 type, text, xmlUrl 속성을 포함한다. type의 값은 rss가 되고 text는 RSS의 channel의 하위요소인 title 요소의 값으로 초기화 된다. 하지만 text 속성은 사용자가 편집할 수 있기 때문에 항상 RSS의 title 요소에 의존해서는 안된다. xmlUrl은 RSS Feed 주소를 값으로 가진다. <outline>는 그 이외에도 0개 이상의 선택적 요소를 포함 할 수 있는데 description, htmlUrl, language, title, version과 같은 속성들을 추가적으로 가질 수 있다. description은 RSS의 channel의 하위 요소인 description 요소의 값이고 htmlUrl은 channel의 하위 요소인 link의 값이 된다. language의 값은 channel의 하위 요소인 language의 값을 따른다. title은 아마 text와 같은 값을 가질 것이고 RSS Feed 교환을 목적으로 사용 할 경우 생략 할 수 없다. version의 경우 공급되는 RSS의 버전에 따라 달라지고 값으로는 RSS 1.0을 위한 RSS1과 RSS 0.91, 0.92 또는 2.0을 위한 RSS, scriptingNews 형식을 위한 scriptingNews가 될 것이다. Atom Feed를 위한 값은 정해져 있지 않지만 분명 추가 제공될 것이라고 한다.

OPML은 현재 2.0 Draft Spec까지 나와있다. 더 자세한 사항을 보고 싶은 사람들은 아래 참고 자료들을 참조하면 좋을 것이다.

  • 참고

한글 : OPML 2.0 Draft Specification (Korean)

영문 : OPML 2.0 Draft Specification (English)