본문 바로가기
[최대48만원] 인터넷•TV 가입시 설치당일 현금지급 정수기 렌탈시 최대50만원 추가지급
엔지엠 매크로

[부록] 7-1. Rss, Atom Reader 만들기. (Rich Site Summary)

by 업무자동화 2016. 3. 7.
반응형

http://ngmaster.mooo.com/ngmaster/xe/index.php?document_srl=11649&mid=STUDY_FRAMEWORK


안녕하세요. 소심비형입니다. 오늘은 간단하게 RSS를 구독할 수 있는 툴을 만들어 보도록 하겠습니다. 한 10년전쯤 윈폼을 이용하여 만들어둔게 있긴한데... 아무튼, 이번에는 SCSF위에 윈폼으로 구현하고 시간될 때 WPF를 이용하여 간단하게 다시 만들어 보도록 하겠습니다. 처음 접하시는 분들은 참고용으로 보시면 좋을거 같네요^^;


※ RSS란?

RSS(Rich Site Summary)는 뉴스나 블로그 사이트에서 주로 사용하는 콘텐츠 표현 방식이다. 웹 사이트 관리자는 RSS 형식으로 웹 사이트 내용을 보여 준다. 이 정보를 받는 사람은 다른 형식으로 이용할 수 있다.RSS 리더에는 웹기반형과 설치형이 있다. 웹기반형 리더는 간단한 계정등록으로 어디에서든 이용할 수 있다는 장점을 가지고 있다.

RSS가 등장하기 전에는 원하는 정보를 얻기 위해 해당 사이트를 직접 방문하여야 했으나, RSS 관련 프로그램(혹은 서비스)을 이용하여 자동 수집이 가능해졌기 때문에 사용자는 각각의 사이트 방문 없이 최신 정보들만 골라 한 자리에서 볼 수 있다.

또한 RSS는 팟캐스팅과 같은 미디어 배포의 용도로도 사용된다. RSS 2.0 의 〈enclosure〉태그 내에 MP3 나 MOV 등의 미디어 파일을 첨부하여 배포하면, 팟캐스팅 클라이언트를 이용해 파일을 내려 받아 감상할 수 있다.

RSS 2.0은 공식적으로 완료된 것으로 선언되었으며, 하버드 대학교가 저작권을 보유하고 있다.

[ 출처: 위키백과 ]


우선, SCSF를 이용하여 View를 추가합니다.

002.png



이름은 RssReaderView로 지정한 후 "마침"을 클릭하세요.

003.png



뷰가 추가되었으면, 메뉴를 생성하고 메뉴를 클릭할 때 뷰가 화면에 표시될 수 있도록 ModuleController에 아래와 같이 코드를 추가합니다.

ModuleController.cs

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
private void ExtendMenu()
{
    //TODO: add menu items here, normally by calling the "Add" method on
    //      on the WorkItem.UIExtensionSites collection.
    //     
    NG.Management.Menu.Manager menuManager = new Manager(WorkItem);
    RibbonPages pages = menuManager.GetMenuFactory<RibbonPages>();
    Items items = pages.AddNew("Launcher Page").Groups.AddNew("Launcher Group").Items;
    items.AddNew<BarButtonItem>("Dock Open").AddCommand("DockOpen");
    items.AddNew<BarButtonItem>("Tab Open").AddCommand("TabOpen");
    items.AddNew<BarButtonItem>("Linq Open").AddCommand("LinqOpen");
    items.AddNew<BarButtonItem>("Box Plot Open").AddCommand("BoxPlotOpen");
    items.AddNew<BarButtonItem>("FTP Client").AddCommand("FtpClientOpen");
    items.AddNew<BarButtonItem>("Excel Open").AddCommand("ExcelOpen");
 
    items = pages["Launcher Page"].Groups.AddNew("Utilies").Items;
    items.AddNew<BarButtonItem>("NGMASTER Zip").AddCommand("ZipOpen");
 
    items = pages["Launcher Page"].Groups["Utilies"].Items;
    items.AddNew<BarButtonItem>("RSS Reader").AddCommand("RssReaderOpen");
 
    menuManager.WorkItem = WorkItem.RootWorkItem;
    pages = menuManager.GetMenuFactory<RibbonPages>();
    pages.IndexChange(100, pages[0]);
}



57, 58라인처럼 Launcher Page메뉴의 Utilies그룹에 Rss Reader버튼을 추가했습니다. 이 버튼을 클릭할 때 뷰를 보여줄 커멘드 핸들러도 같이 추가해야 합니다.

ModuleController.cs

133
134
135
136
137
138
[CommandHandler("RssReaderOpen")]
public void OnRssReaderOpenHandler(object sender, EventArgs e)
{
    NG.Management.View.Manager viewManager = new Management.View.Manager(WorkItem);
    viewManager.TabView.Show<RssReaderView>("RSS Reader");
}



RSS와 같은 경우에는 이 후 다음 버전이 나오거나 또는 새로운 형식을 지원할 가능성(?)이 있기 때문에 별도의 라이브러리로 파서(Parser)를 개발하는게 좋을거 같군요. 아래 그림처럼 프로젝트를 추가해주세요.

005.png



우선, 파싱에 사용될 클래스들을 추가합니다. 현재 지원하고 있는 형식은 Rss 1.0과 Rss 2.0, 그리고 Atom이 있습니다. 미리 3개 모두 추가하세요.

006.png



Feed 데이타를 나타내는 모델을 추가합니다. 아래와 같이 Feed와 FeedItem을 추가했습니다. Feed는 사이트 또는 블로그에서 제공하는 Feed의 정보를 나타내며, FeedItem은 사이트 또는 블로그의 컨텐츠 데이터 모델입니다.

007.png



Feed를 만들기전에 Item을 관리할 컬렉션을 추가해야 합니다. Models폴더에 FeedItems 클래스를 생성한 후 아래와 같이 코드를 추가 해주세요.

FeedItems.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections;
 
namespace NG.Rss.Reader.Models
{
    /// <summary>
    /// 피드 컨텐츠 항목들의 컬렉션입니다.
    /// </summary>
    public class FeedItems : CollectionBase
    {
        /// <summary>
        /// 인덱스에 위치한 <see cref="FeedItem"/>를 가져옵니다.
        /// </summary>
        /// <param name="index">가져올 <see cref="FeedItem"/>의 인덱스입니다.</param>
        /// <returns><see cref="FeedItem"/></returns>
        public FeedItem this[int index]
        {
            get { return List[index] as FeedItem; }
        }
 
        /// <summary>
        /// <see cref="FeedItem"/>을 추가합니다.
        /// </summary>
        /// <param name="item"><see cref="FeedItem"/></param>
        public void Add(FeedItem item)
        {
            List.Add(item);
        }
 
        /// <summary>
        /// <see cref="FeedItem"/>을 지정한 위치에 추가합니다.
        /// </summary>
        /// <param name="index"><see cref="FeedItem"/>이 추가될 위치입니다.</param>
        /// <param name="item"><see cref="FeedItem"/></param>
        public void Insert(int index, FeedItem item)
        {
            List.Insert(index, item);
        }
 
        /// <summary>
        /// <see cref="FeedItem"/>을 제거합니다.
        /// </summary>
        /// <param name="item"><see cref="FeedItem"/></param>
        public void Remove(FeedItem item)
        {
            List.Remove(item);
        }
 
        /// <summary>
        /// 지정한 위치의 <see cref="FeedItem"/>을 제거합니다.
        /// </summary>
        /// <param name="index"><see cref="FeedItem"/>을 제거할 인덱스입니다.</param>
        public void Remove(int index)
        {
            if (index < 0 || index > List.Count - 1)
                throw new ArgumentOutOfRangeException(string.Format("인덱스는 0부터 {0}까지 지정할 수 있습니다.", List.Count - 1));
            else
                List.RemoveAt(index);
        }
    }
}



이제 Feed 추상 클래스를 만듭니다. 그전에 기본적으로 Rss 1.0과 Rss 2.0, 그리고 Atom의 태그에서 공통적인 부분을 추출해야 하겠죠? 이 공통적인 부분을 추상화하고 세부적인 구현은 파생 클래스에서 정의하는게 좋을거 같네요.

반응형

댓글