먼저 RSS 피드를 즐겨찾기에 등록 요청이 왔을 때 이를 개체화하는 RSSFavorite 클래스를 구현합시다.
RSSFavorite 형식 개체는 RSS 브라우저 응용을 끝낼 때 파일로 저장하였다가 다시 실행할 때 로딩하여 사용할 것입니다. 이를 위해 직렬화 가능한 형식 개체로 지정합시다.
[Serializable] public class RSSFavorite { }
멤버 속성으로 타이틀과 페이지 주소, 설명, 폴더를 제공합시다.
public string Title { get; private set; } public string Link { get; private set; } public string Description { get; private set; } public string Folder { get; private set; }
RSSFavorite 개체는 RSS 피드를 등록하였을 때 이 정보를 개체로 표현할 것입니다. 여기서는 등록할 RSS 피드의 주소와 항목을 보관할 컬렉션을 입력 인자로 받아 RSSFavorite 개체를 생성하는 정적 메서드를 제공할게요.
public static RSSFavorite MakeRSSFavorite(string rsslink, List<Item> rilist)
먼저 XmlDocument 개체를 생성하여 RSS 피디의 주소의 내용을 로드합니다.
XmlDocument xdoc = new XmlDocument(); xdoc.Load(rsslink);
루트 노드인 rss 노드를 선택하고 자식 노드인 channel 노드를 선택합니다.
XmlNode rnode = xdoc.SelectSingleNode("rss"); XmlNode cnode = rnode.SelectSingleNode("channel");
channel 노드의 자식 요소의 정보로 타이틀, 주소, 상세 정보, 폴더 정보를 얻어옵니다.
string title = string.Empty; string link = string.Empty; string desc = string.Empty; string folder = string.Empty; try { title = cnode.SelectSingleNode("title").InnerText; link = cnode.SelectSingleNode("link").InnerText; desc = cnode.SelectSingleNode("description").InnerText; folder = cnode.SelectSingleNode("folder").InnerText; } catch { }
항목 정보를 얻기 위해 item 노드 리스트를 선택합니다.
XmlNodeList xnl = cnode.SelectNodes("item");
선택한 item 노드 리스트의 각 항목으로 Item 개체를 생성하여 Item 컬렉션에 추가합니다.
foreach (XmlNode xn in xnl) { Item item = MakeItem(rsslink,xn); rilist.Add(item); }
이렇게 얻은 정보로 RssFavorite 개체를 생성하여 반환합니다.
return new RSSFavorite(title, link, desc, folder);
Item 개체를 만드는 MakeItem 정적 메서드를 구현합시다.
private static Item MakeItem(string rsslink, XmlNode xn)
입력 인자로 받은 XmlNode의 자식 항목으로 타이틀, 상세 설명, 이미지 위치, 페이지 주소, 게시자, 게시 일시 정보를 얻어옵니다.
string title = xn.SelectSingleNode("title").InnerText; string orgin_desc = xn.SelectSingleNode("description").InnerText; string image = string.Empty; if (orgin_desc.IndexOf("img src=\"") != -1) { int start_index = "img src=\"".Length + 1; int length = orgin_desc.IndexOf("\">") - start_index; image = orgin_desc.Substring(start_index, length); orgin_desc = orgin_desc.Substring(start_index + length + 2); } string desc = orgin_desc; string link = xn.SelectSingleNode("link").InnerText; string author = xn.SelectSingleNode("author").InnerText; DateTime dt = DateTime.Parse(xn.SelectSingleNode("pubDate").InnerText); return new Item(title, desc, link, dt, author, image);
생성자 메서드는 정적 메서드 MakeRSSFavorite에 의해 호출하며 다른 형식에서 호출하지 않습니다. 따라서 접근 지정을 private로 지정할게요.
private RSSFavorite(string title,string link,string desc,string folder)
생성자에서는 입력 인자로 전달받은 것으로 속성을 설정합니다.
Title = title; Link = link; Description = desc; Folder = folder;
ToString 메서드를 재정의하여 타이틀을 반환합시다.
public override string ToString() { return Title; }
▷ RSSFavorite.cs
using System; using System.Collections.Generic; using System.Xml; namespace RSSBrowserLib { /// <summary> /// 관심 갖는 RSS /// </summary> [Serializable] public class RSSFavorite { /// <summary> /// 타이틀 - 가져오기 /// </summary> public string Title { get; private set; } /// <summary> /// 페이지 주소 - 가져오기 /// </summary> public string Link { get; private set; } /// <summary> /// 설명 - 가져오기 /// </summary> public string Description { get; private set; } /// <summary> /// 폴더 - 가져오기 /// </summary> public string Folder { get; private set; } /// <summary> /// RSSFavorite 개체를 생성하는 정적 메서드 /// </summary> /// <param name="rsslink">RSS 주소</param> /// <param name="rilist">항목</param> /// <returns>RSSFavorite 개체</returns> public static RSSFavorite MakeRSSFavorite(string rsslink, List<Item> rilist) { XmlDocument xdoc = new XmlDocument(); xdoc.Load(rsslink); XmlNode rnode = xdoc.SelectSingleNode("rss"); XmlNode cnode = rnode.SelectSingleNode("channel"); string title = string.Empty; string link = string.Empty; string desc = string.Empty; string folder = string.Empty; try { title = cnode.SelectSingleNode("title").InnerText; link = cnode.SelectSingleNode("link").InnerText; desc = cnode.SelectSingleNode("description").InnerText; folder = cnode.SelectSingleNode("folder").InnerText; } catch { } XmlNodeList xnl = cnode.SelectNodes("item"); foreach (XmlNode xn in xnl) { Item item = MakeItem(rsslink,xn); rilist.Add(item); } return new RSSFavorite(title, link, desc, folder); } private static Item MakeItem(string rsslink, XmlNode xn) { string title = xn.SelectSingleNode("title").InnerText; string orgin_desc = xn.SelectSingleNode("description").InnerText; string image = string.Empty; if (orgin_desc.IndexOf("img src=\"") != -1) { int start_index = "img src=\"".Length + 1; int length = orgin_desc.IndexOf("\">") - start_index; image = orgin_desc.Substring(start_index, length); orgin_desc = orgin_desc.Substring(start_index + length + 2); } string desc = orgin_desc; string link = xn.SelectSingleNode("link").InnerText; string author = xn.SelectSingleNode("author").InnerText; DateTime dt = DateTime.Parse(xn.SelectSingleNode("pubDate").InnerText); return new Item(title, desc, link, dt, author, image); } private RSSFavorite(string title,string link,string desc,string folder) { Title = title; Link = link; Description = desc; Folder = folder; } /// <summary> /// ToString 재정의 /// </summary> /// <returns>타이틀</returns> public override string ToString() { return Title; } } }