RSS 서비스 방법

RSS란

RSS(Rellay Simple Syndication or Rich Site Summary) 는 뉴스 Site 나 블로그 처럼 자주 갱신되는 Site 의 내용을 Feed 받을 수 있도록  해주는 파일 형식 (정보의 배급, 배포, 수집에 관한 표준 포맷) 입니다.

RSS 서비스의 목적은 사용자가 원하는 정확한 정보를 빠르게 제공하고 이용자가 관리 가능한 편리한 서비스를 제공하는 것에 있습니다. SOA 형식의 서비스와 연동하여 더 효율적인 서비스를 제공할 수 도 있습니다.

RSS 서비스 방법의 하나인  RSS 리더로 대량의 정보를 체계적이고 지속적으로 관리 가능하게 해줘서 방문자를 증가시킴과 동시에 찾아가는 서비스로 컨텐츠의 관리가 편리 하며 정확한 정보의 제공을 가능하게 해줍니다.

RSS Reader

RSS 서비스 도구로 웹사이트들의 자료를 구축, 교환하기 위한 리더 프로그램으로 사용자가 원하는 블로그나 자주 업데이트되는 사이트의 정보를 각 사이트에 직접 방문하지 않고 RSS리더를 통하여 미리 설정 된 사이트를 돌아다니며 RSS주소를 이용 정보를 쉽게 수집하여 검색하고 확인할 수 있는 도구입니다. RSS 리더의 종류로는 웹 기반의 Rss Reader, 설치형 Rss Reader, 동기화 가능 설치형 Rss Reader가 있습니다.

RSS 서비스1

RSS XML의 구조

RSS 서비스는 XML로 되어 있으며 아래의 예처럼 Channel 태그의 Title, Link, Description 은 필수이며 Item 태그의 Title, Link, Description 중 하나는 필수로 들어가야 합니다.

0: <?xml version="1.0" encoding="euc-kr" ?> 
1: <rss version="2.0"> 
2: <channel> 
3: 	<title>채널의 제목</title> 
4: 	<link>채널의 링크</link> 
5: 	<description>채널에 대한 간략한 설명</description> 
6: 	<language>채널이 작성되는 언어</language> 
7: 	<copyright>채널의 저작권 통지</copyright> 
8: 	<managingEditor>채널 편집 담당자의 전자우편</managingEditor> 
9: 	<webMaster>채널 웹마스타의 전자우편</webMaster> 
10: 	<pubDate>채널 컨텐츠의 발행 시간</pubDate> 
11: 	<lastBuildDate>채널이 마지막으로 변경된 시간</lastBuildDate> 
12: 	<category>채널이 속해있는 카테고리</category> 
13: 	<generator>채널을 생성하는데 사용된 프로그램</generator> 
14: <images> 
15: 	<url>이미지의 URL</url> 
16: 	<title>이미지의 제목</title> 
17: 	<link>해당 사이트의 링크</link> 
18: 	<width>이미지 넓이</width> 
19: 	<height>이미지 높이</height> 
20: </images> 
21: <item> 
22: 	<title>항목의 제목</title> 
23: 	<link>항목의 URL</link> 
24: 	<description>항목의 내용</description> 
25: 	<author>저작자의 전자우편</author> 
26: 	<category>항목이 속해있는 카테고리</category> 
27: 	<comments>항목과 관련된 설명 페이지의 URL</comments> 
28: 	<guid>고유하게 항목을 식별할 수 있는 문자열</guid> 
29: 	<pubDate>항목 발행 시간</pubDate> 
30: </item> 
31: </channel> 
32: </rss>

RSS 서비스가 적용된 사이트
rss가 적용된 사이트

RSS Javasript 는

1. Rss를 분석하여 어떤 elements를 가지고 표현할 것인지 결정.
2. Rss를 XML로 받아와서 Javascript의 XMLHttpRequest 객체를 가지고 구현.
3. 받아온 XML을 Javascript JSON 포맷으로 파싱.
4. JSON을 받아서 화면에 HTML 코드로 출력.

순으로 구현하며 RSS  ASP.NET은

1. System.Xml 참조.
2. HttpWebRequest 객체로 URL을 파라미터로 XML 요청
3. HttpWebResponse 객체로 HttpWebRequest로 요청한 XML 받음.
4. XmlDocument 객체에 httpRes.GetResponseStream() 메소드로 스트림 타입 생성.
5. XmlNode 에 XmlDocument.SelectSingleNode로 아이템을 하나씩 선택하여
값을 넣음.
6. 아이템값을 데이터 테이블이나 Repeater에 바인딩 시켜서 출력.

순으로 구현됩니다.

javascript RSS  예제

RSS 자바스크립트 예제 파일

 

Asp.net RSS 예제 (RSS 컨텐츠를 DB에 저장)

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" Debug="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
   	<form id="Form1" method="post" runat="server">
    <div></div>
    <div align="center">
            &nbsp;<asp:TextBox id="tbx_url" runat="server" Width="418px" >http://blog.rss.naver.com/jeffyang.xml</asp:TextBox>
      <asp:Button id="btn_submit" runat="server" Text="GetRssFeeds()" onclick="btn_submit_click" />
    </div>
    
    <div align="center">
            &nbsp;<asp:DataList id="dlist_title" runat="server">
      
      <HeaderTemplate>
        <table border="0" cellpadding="0" cellspacing="0" width="560" bgcolor="#afafaf" style="padding:0px 10px 0px 10px; margin-top:10px;">
          <tr height="28" bgcolor="#d4d4d4" style="font-size:10pt;font-family:Arial, @굴림체">
            <td>  Blog Information </td>
          </tr> 
      </HeaderTemplate>
      
      <ItemTemplate>
        <tr height="26" bgcolor="#ffffff" style="font-size:9pt;font-family:Arial, @굴림체">
          <td align="left">
            * title : <%# DataBinder.Eval(Container.DataItem, "title") %><br />
            * link : <a href="<%# DataBinder.Eval(Container.DataItem, "link") %>" target="_blank">
            <%# DataBinder.Eval(Container.DataItem, "link") %></a><br />
            * description : <%# DataBinder.Eval(Container.DataItem, "description") %><br />
            * language : <%# DataBinder.Eval(Container.DataItem, "language") %><br />
            * pubDate : <%# DataBinder.Eval(Container.DataItem, "pubDate") %><br />
            * generator : <%# DataBinder.Eval(Container.DataItem, "generator") %><br />											
            </td>
        </tr>
      </ItemTemplate>
    
      <FooterTemplate> </table> </FooterTemplate>	
    </asp:DataList>
    
    <asp:DataList id="dlist_item" runat="server">
      
      <HeaderTemplate>
        <table border="0" cellpadding="0" cellspacing="0" width="560" bgcolor="#afafaf" style="padding:0px 10px 0px 10px; margin-top:10px;">
          <tr height="28" bgcolor="#d4d4d4" style="font-size:10pt;font-family:Arial, @굴림체">
            <td>  Rss Feeds(<%= tbx_url.Text %>) List </td>
          </tr> 
      </HeaderTemplate>
      
      <ItemTemplate>
        <tr height="26" bgcolor="#ffffff" onmouseover="this.style.backgroundColor='#f4f4f4'" onmouseout="this.style.backgroundColor='#ffffff'"  style="font-size:9pt;font-family:Arial, @굴림체">
          <td align="left">
            <a href="<%# DataBinder.Eval(Container.DataItem, "link") %>" target="_blank">
            <%# DataBinder.Eval(Container.DataItem, "title")%></a> / <%# DataBinder.Eval(Container.DataItem, "pubDate") %></td>
        </tr>
      </ItemTemplate>
    
      <FooterTemplate> 
        <tr height="30" bgcolor="#d4d4d4" align="center" style="font-size:10pt;font-family:Arial, @굴림체">
          <td>by mcsong(mcsong_at_gmail.com)</td>
        </tr></table> </FooterTemplate>	
    </asp:DataList>
    </div>		
    <br />
    <br />
    <div align="center">
        <table>
            <tr>
                <td style="width: 82px"><asp:Button ID="Button1" runat="server" Text="저장" OnClick="Button1_Click" /></td>
                    <td style="width: 82px">
                        <asp:Button ID="Button2" runat="server" Text="Export" OnClick="Button2_Click" /></td>
            </tr>
        </table>
            &nbsp;&nbsp;
    </div>
    <div align="center">
        <table>
            <tr>
                <td style="width: 708px">
                        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
                            AutoGenerateColumns="False"
                            Width="645px" CellPadding="4" ForeColor="#626262" GridLines="None" Font-Size="Smaller" OnPageIndexChanging="GridView1_PageIndexChanging"  >
                            <Columns>
                                <asp:BoundField DataField="idx" HeaderText="idx" InsertVisible="False" >
                                    <ControlStyle Width="50px" />
                                    <ItemStyle HorizontalAlign="Center" />
                  <HeaderStyle Font-Size="11px" />
                                </asp:BoundField>
                                <asp:HyperLinkField DataNavigateUrlFields="idx" DataNavigateUrlFormatString="RssView.aspx?idx={0}"
                                    DataTextField="title" HeaderText="제목(Title)" >
                                    <ControlStyle Width="425px" />
                                    <ItemStyle HorizontalAlign="Left" />
                  <HeaderStyle Font-Size="11px" />
                                </asp:HyperLinkField>
                                <asp:HyperLinkField DataNavigateUrlFields="link" DataNavigateUrlFormatString="{0}"
                                    DataTextField="author" HeaderText="작성자" Target="_blank">
                                    <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                                    <ControlStyle Width="50px" />
                  <HeaderStyle Font-Size="11px" HorizontalAlign="Center" VerticalAlign="Middle" />
                                </asp:HyperLinkField>
                                <asp:BoundField DataField="pubDate" HeaderText="Date" >
                                    <ControlStyle Width="50px" />
                                    <ItemStyle HorizontalAlign="Center" />
                  <HeaderStyle Font-Size="11px" />
                                </asp:BoundField>
                                <asp:BoundField DataField="readnum" HeaderText="Hit" >
                                    <ControlStyle Width="30px" />
                                    <ItemStyle HorizontalAlign="Center" />
                  <HeaderStyle Font-Size="11px" />
                                </asp:BoundField>
                            </Columns>
                        </asp:GridView>
                </td>
            </tr>
            <tr>
                <td height=4 style="width: 708px">
                </td>
            </tr>
        </table>
    </div>
  </form>
</body>
</html>

Default.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
using System.Text;

public partial class _Default : System.Web.UI.Page 
{
    protected SqlConnection Con;
    protected SqlCommand Cmd;

    System.Xml.XmlTextReader reader;
    DataSet ds;
  

    protected void Page_Load(object sender, EventArgs e)
    {
       
    }
    private void ShowSearch()
    {
        Con = new SqlConnection();

        Con.ConnectionString = "Server=ServerAddress;database=RssTable;user id=UserId;password=UserPassword";

      
        string QRYSelect = "SELECT idx, author, category, title, link, guid, description, pubDate, readnum  FROM RSS";
 
        
        Cmd = new SqlCommand(QRYSelect, Con);
        Con.Open();
        SqlDataReader readerSql = Cmd.ExecuteReader(CommandBehavior.CloseConnection);

        DataTable dt = new DataTable();
        DataRow dr;

        dt.Columns.Add(new DataColumn("idx", typeof(int)));
        dt.Columns.Add(new DataColumn("title", typeof(string)));
        dt.Columns.Add(new DataColumn("author", typeof(string)));
        dt.Columns.Add(new DataColumn("link", typeof(string)));
        dt.Columns.Add(new DataColumn("pubDate", typeof(string)));
        dt.Columns.Add(new DataColumn("readnum", typeof(int)));

        string title;

        while (readerSql.Read())
        {
            dr = dt.NewRow();

            dr[0] = readerSql["idx"].ToString();
            title = readerSql["title"].ToString();
            dr[1] = readerSql["title"].ToString();
            dr[2] = readerSql["author"].ToString();
            dr[3] = readerSql["link"].ToString();

            dr[4] = readerSql["pubDate"].ToString().Substring(0, 10);
            dr[5] = readerSql["readnum"];
            dt.Rows.Add(dr);

        }
        DataView dv = new DataView(dt);
        GridView1.DataSource = dv;
        GridView1.DataBind();
        readerSql.Close();

        Con.Close();
        
    }



  protected void btn_submit_click(object sender, System.EventArgs e)
  {
        //RSS 읽어오기
        reader = new System.Xml.XmlTextReader(tbx_url.Text);

        ds = new DataSet();
        ds.ReadXml(reader);


        dlist_title.DataSource = ds.Tables["channel"];
        dlist_title.DataBind();

        dlist_item.DataSource = ds.Tables["item"];
        dlist_item.DataBind();

  
        ShowSearch();

  }
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        ShowSearch();

    }
 
    protected void Button1_Click(object sender, EventArgs e)
    {
        Con = new SqlConnection();

        Con.ConnectionString = "Server=ServerAddress;database=RssTable;user id=UserId;password=UserPassword";


        string QRY = "INSERT INTO rss (chidx, author, category, title, link, guid, description, pubDate,readnum) VALUES (@IDX, @A, @B, @C, @D, @E, @F, @G,0)";
        string QryChannel = "INSERT INTO channel (no,title,link, description, language, pubDate, generator) "
                            + "VALUES (@No,@title,@H, @I, @J, @K, @L)";

        reader = new System.Xml.XmlTextReader(tbx_url.Text);
        

        ds = new DataSet();
        ds.ReadXml(reader);
        Con.Open();

        Cmd = new SqlCommand("SELECT count(*) FROM CHANNEL", Con);
        
        SqlDataReader readerSqls = Cmd.ExecuteReader();
        int no = 1;
        readerSqls.Read();
        if (!readerSqls[0].ToString().Equals(""))
            no = int.Parse(readerSqls[0].ToString()) + 1;
        Con.Close();
        Con.Open();
        int rowCnt = ds.Tables["item"].Rows.Count;
        int i;



        Cmd = new SqlCommand(QryChannel, Con);

        try
        {
            Cmd.Parameters.Add(new SqlParameter("@No", no));
            Cmd.Parameters.Add(new SqlParameter("@title", ds.Tables["channel"].Rows[0]["title"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@H", ds.Tables["channel"].Rows[0]["link"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@I", ds.Tables["channel"].Rows[0]["description"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@J", ds.Tables["channel"].Rows[0]["language"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@K", ds.Tables["channel"].Rows[0]["pubDate"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@L", ds.Tables["channel"].Rows[0]["generator"].ToString()));

        }
        catch
        { 
        
        }
        
        Cmd.ExecuteNonQuery();

        Cmd = new SqlCommand("SELECT link FROM CHANNEL WHERE idx = (SELECT MAX(idx) FROM CHANNEL)", Con);
        SqlDataReader readerSql = Cmd.ExecuteReader();
        string chidx = "";
        readerSql.Read();
        chidx =  readerSql[0].ToString();
        Con.Close();
        
        Cmd = new SqlCommand(QRY, Con);

        Con.Open();
        for (i = 0; i < rowCnt; i++)
        {
            Cmd.Parameters.Add(new SqlParameter("@idx", chidx));
            Cmd.Parameters.Add(new SqlParameter("@A", ds.Tables["item"].Rows[i]["author"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@B", ds.Tables["item"].Rows[i]["category"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@C", ds.Tables["item"].Rows[i]["title"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@D", ds.Tables["item"].Rows[i]["link"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@E", ds.Tables["item"].Rows[i]["guid"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@F", ds.Tables["item"].Rows[i]["description"].ToString()));
            Cmd.Parameters.Add(new SqlParameter("@G", ds.Tables["item"].Rows[i]["pubDate"].ToString()));
            Cmd.ExecuteNonQuery();
            Cmd.Parameters.Clear();

        }

        Con.Close();
        ShowSearch();

    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        DataSet data = new DataSet();
        DataSet data2 = new DataSet();

        DataTable dtChannel = new DataTable();
        DataTable dtItem = new DataTable();

        SqlConnection con = new SqlConnection("Server=ServerAddress;database=RssTable;user id=UserId;password=UserPassword");
        SqlCommand cmd = new SqlCommand("SELECT * FROM CHANNEL WHERE NO = " + (int.Parse(GridView1.PageIndex.ToString()) + 1),con);
        
        SqlDataAdapter dap = new SqlDataAdapter(cmd);
        dap.Fill(data);
        dtChannel = data.Tables[0];
        
        SqlCommand cmd2 = new SqlCommand("SELECT * FROM RSS WHERE chidx = '" + dtChannel.Rows[0]["link"].ToString() + "'", con);
        SqlDataAdapter dap2 = new SqlDataAdapter(cmd2);
        dap2.Fill(data2);
        dtItem = data2.Tables[0];

        con.Open();
 
        
        XmlTextWriter tw = new XmlTextWriter(Request.PhysicalApplicationPath  + "test.xml", Encoding.UTF8);
        tw.Formatting = Formatting.Indented;
        tw.WriteStartDocument();
        tw.WriteStartElement("rss");
        tw.WriteAttributeString("version", "2.0");

            tw.WriteStartElement("channel");
            
            tw.WriteElementString("title", dtChannel.Rows[0]["title"].ToString());
            tw.WriteElementString("link", dtChannel.Rows[0]["link"].ToString());
            tw.WriteElementString("description", dtChannel.Rows[0]["description"].ToString());
            tw.WriteElementString("language", dtChannel.Rows[0]["language"].ToString());
            tw.WriteElementString("copyright", dtChannel.Rows[0]["copyright"].ToString());
            tw.WriteElementString("managingEditor", dtChannel.Rows[0]["managingEditor"].ToString());
            tw.WriteElementString("webMaster", dtChannel.Rows[0]["webMaster"].ToString());
            tw.WriteElementString("pubDate", dtChannel.Rows[0]["pubDate"].ToString());
            tw.WriteElementString("lastBuildDate", dtChannel.Rows[0]["lastBuildDate"].ToString());
            tw.WriteElementString("category", dtChannel.Rows[0]["category"].ToString());
            tw.WriteElementString("generator", dtChannel.Rows[0]["generator"].ToString());
            
            tw.WriteEndElement();

            for (int i = 0; i < dtItem.Rows.Count; i++)
            {
                tw.WriteStartElement("item");
                tw.WriteElementString("title", dtItem.Rows[i]["title"].ToString());
                tw.WriteElementString("link", dtItem.Rows[i]["link"].ToString());
                tw.WriteElementString("description", dtItem.Rows[i]["description"].ToString());
                tw.WriteElementString("author", dtItem.Rows[i]["author"].ToString());
                tw.WriteElementString("category", dtItem.Rows[i]["category"].ToString());
                tw.WriteElementString("guid", dtItem.Rows[i]["guid"].ToString());
                tw.WriteElementString("pubDate", dtItem.Rows[i]["pubDate"].ToString());
                tw.WriteEndElement();
            }
            
        tw.WriteEndDocument();
        tw.Flush();
        tw.Close();

        con.Close();
    }

}

 

댓글 남기기