먼저 RSS 피드를 즐겨찾기에 등록 요청이 왔을 때 이를 개체화하는 RSSFavorite 클래스를 구현합시다.
RSSFavorite 형식 개체는 RSS 브라우저 응용을 끝낼 때 파일로 저장하였다가 다시 실행할 때 로딩하여 사용할 것입니다. 이를 위해 직렬화 가능한 형식 개체로 지정합시다.
1 2 3 4 |
[Serializable] public class RSSFavorite { } |
멤버 속성으로 타이틀과 페이지 주소, 설명, 폴더를 제공합시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 개체를 생성하는 정적 메서드를 제공할게요.
1 |
public static RSSFavorite MakeRSSFavorite(string rsslink, List<Item> rilist) |
먼저 XmlDocument 개체를 생성하여 RSS 피디의 주소의 내용을 로드합니다.
1 2 |
XmlDocument xdoc = new XmlDocument(); xdoc.Load(rsslink); |
루트 노드인 rss 노드를 선택하고 자식 노드인 channel 노드를 선택합니다.
1 2 |
XmlNode rnode = xdoc.SelectSingleNode("rss"); XmlNode cnode = rnode.SelectSingleNode("channel"); |
channel 노드의 자식 요소의 정보로 타이틀, 주소, 상세 정보, 폴더 정보를 얻어옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 노드 리스트를 선택합니다.
1 |
XmlNodeList xnl = cnode.SelectNodes("item"); |
선택한 item 노드 리스트의 각 항목으로 Item 개체를 생성하여 Item 컬렉션에 추가합니다.
1 2 3 4 5 |
foreach (XmlNode xn in xnl) { Item item = MakeItem(rsslink,xn); rilist.Add(item); } |
이렇게 얻은 정보로 RssFavorite 개체를 생성하여 반환합니다.
1 |
return new RSSFavorite(title, link, desc, folder); |
Item 개체를 만드는 MakeItem 정적 메서드를 구현합시다.
1 |
private static Item MakeItem(string rsslink, XmlNode xn) |
입력 인자로 받은 XmlNode의 자식 항목으로 타이틀, 상세 설명, 이미지 위치, 페이지 주소, 게시자, 게시 일시 정보를 얻어옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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로 지정할게요.
1 |
private RSSFavorite(string title,string link,string desc,string folder) |
생성자에서는 입력 인자로 전달받은 것으로 속성을 설정합니다.
1 2 3 4 |
Title = title; Link = link; Description = desc; Folder = folder; |
ToString 메서드를 재정의하여 타이틀을 반환합시다.
1 2 3 4 |
public override string ToString() { return Title; } |
▷ RSSFavorite.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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
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; } } } |