1. RSS란?
RDF Site Summary or Really Simple Syndication의 줄인말로 뉴스나 블로그등과 같이 컨텐츠가 자주 업데이트가 되는 사이트들이 업데이트된 정보를 쉽게 사용자들에게 제공하기 위해 만들어진 포맷입니다. XML(Extensible Markup Language) 기반으로 되어 있으며 간단하게 제목, 내용, 날짜 등의 배포에 필요한 최소한의 정보를 통해 쉽게 작성할 수 있도록 구성되어 있으며 현재 0.9, 1.0, 2.0 등 다양한 버전으로 서비스가 되고 있습니다.

뉴스나 블로그등의 사이트에서 'RSS Feed', 의 아이콘을 보신적이 있으실 것입니다. 위의 표시는 해당 사이트에서 RSS 서비스를 제공하고 있다는 일반적인 표현 방법입니다. 국내의 경우는 RSS 서비스가 많이 활성화 되지 않은 상태라 일반적인 사이트에서 많이 보실수 없겠지만 점차적으로 이용 범위가 넓어 질것이라고 생각합니다. 아래는 국내에서 RSS 서비스를 제공하고 있는 사례입니다.

RSS 서비스를 제공하고 있는 사이트에서 메뉴를 Click 하였을 경우 XML 구문이 출력이 되는 것을 볼 수 있을 것입니다. RSS를 전혀 모르는 사람이라면 당혹해 하거나 이해하기 어려울 것입니다.심지어 일반사용자의 경우에는 에러화면으로 오해 할수도 있을 것입니다. 그러나 해당 메뉴에서 중요한 것은 내용이 아닌 URL 정보이며, 제공된 URL 정보는 RSS Reader를 통하여 조회하여 볼 수 있습니다. 일반 사용자가 많이 사용하는 사이트의 경우는 "주소복사" 기능이나 도움말을 제공하여 사용자의 이해를 돕는 것이 중요하다고 생각합니다.

좀 더 시간이 지나면 브라우저,메일 클라이언트,웹메일등에서 모두 RSS Reader 기능을 제공할 것이고 그때가 되면 좀 더 손 쉽게 자신이 원하는 정보를 빠르게 조회하여 볼 수 있을 것입니다.

<?xml version="1.0" encoding="euc-kr" ?> 
- <rss version="2.0">
- <channel>
  <title>아이헬퍼스</title> 
  <link>http://www.ihelpers.co.kr</link> 
  <description>아이헬퍼스</description> 
  <language>ko</language> 
  <lastBuildDate>Nov, 13 2004 01:33:48 GMT</lastBuildDate> 
  <webMaster>smson@ihelpers.co.kr</webMaster> 
- <item>
  <title>게시판의 조회수를 정확하게 측정하자</title> 
  <link>http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=458</link> 
  <author>손상모</author> 
  <pubDate>Nov, 13 2004 01:33:48 GMT</pubDate> 
  <category>Tip&Tech</category> 
  </item>
  ....

[ RSS 메뉴 클릭시에 출력되는 XML 구문 예 ]

2. RSS는 왜 그리고 어디에 사용되나?
RSS는 가장 성공적인 XML 서비스로써 웹사이트를 통해 콘텐츠 정보를 교환하는 커뮤니티 표준으로 자리를 잡아 가고 있습니다. 본인은 RSS를 웹의 가장 큰 특징인 HyperText 기능의 웹서비스 형태로의 발전이라고 생각합니다. 웹이 정보를 오픈시켰다면 RSS는 해당 정보를 배달시켜 줄 것입니다.

RSS를 운영자와 사용자의 입장에서 보았을때, 서비스 운영자는 신규 또는 추천 정보를 고객에서 보다 손쉽게(이메일 정보 발송을 위한 컨텐츠 구성과 이메일 발송과 같은 작업이 필요 없이) 제공할 수 있으며 사용자는 관심있는 정보를 쉽고 빠르게 조회 할 수 있게 됩니다.

혹자의 경우는 RSS 서비스를 하게 되면 웹사이트를 직접 방문하는 사용자가 줄어 들게 되지 않냐고 이야기 합니다. 그러나 서비스 운영자가 RSS 서비스와 같은 형태의 Deep Link로 인하여 메인 페이지에 노출되는 광고의 Impression 이 줄어 드는 것을 일정 부분 포기한다면, 대신 관련 컨텐츠에 관심이 많은 구독자를 얻게 될 것입니다. 오히려 해당 컨텐츠를 주기적으로 모니터하는 구독자로 인하여 발생하는 Traffic을 걱정해야 할것입니다.

중요한 것은 이미 수많은 정보들이 사용자에게 오픈되어 기다리고 있고, 이 정보의 바다 속에서 경쟁 업체보다 어떻게 빠르고 정확하게 서비스를 제공하느냐, 원하는 정보를 보다 쉽고 빠르게 얻을 수 있느냐 일것입니다. RSS는 당신의 정보를 쉽고 빠르게 제공해 줄 것입니다.

웹이 신문과 방송보다 정보를 빠르게 제공하고 있으며, 이와 같이 가장 빠른 웹의 정보중에서  RSS는 당신이 원하는 정보(뉴스,키워드검색 정보등)를 더욱 빠르고 쉽게 배달해 주는 좋은 도구 역활을 할 것입니다.

아래는 RSS 주요 사용 분야입니다.

  • 뉴스 및 공지사항 - 매시간 새로운 정보가 추가,변경 되는 뉴스 또는 신규소식 서비스
  • 강좌 - 고객이 매번 사이트를 방문하여 규칙적으로 확인하지 않는 컨텐츠 서비스
  • 일정 - 주요 행사, 마감일자 또는 휴일정보
  • 검색결과 - 관심 키워드에 대한 변경 및 신규 정보 조회 서비스
  • 메일링 리스트 - 주기적으로 이메일로 고객에서 서비스 한 내용 모음
  • 입찰정보,채용정보
3. RSS Readers(Aggregators)
  • http://www.xpyder.co.kr/ (국내)
    웹기반과 Application 기반의 Reader를 모두 제공하고 있으며 RSS Directory 서비스도 제공한다. Application Reader는 .NET 기반으로 개발하여 Microsoft .NET Framework 1.1 이상을 설치하여야 한다.
  • http://www.bloglines.com/
    웹기반의 Reader 기능과 Directory & Search 서비스를 제공한다.
  • http://www.sharpreader.net/
    원도우기반의 Reader로써 Microsoft .NET Framework 1.1 설치하여야 한다. 상당히 간단하게 구성되어 있기 때문에 처음 RSS 접하는 분에게 적극 추천한다.

    그외의 Reader 보기

4. 관련 정보
기술은 빠르게 변해 가고 정보에 대한 생명주기는 점점 짧아 지고 있습니다. 이와 같은 시대 속에 자신을 효과적으로 알리지 못한다며, 당신의 경쟁 업체가 당신보다 항상 상위에서 서비스 될 것 이며,당신이 웹서핑하면서 정보를 찾고 있을 때 옆의 동료는 차를 마시면서 관련된 정보를 다양한 채널을 통하여 읽고 있을 것입니다.

구글의 성공은 정보화시대 속에서 정보의 정확성과 편의성이 얼마나 중요한 가를 다시 한번 생각하게 합니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
TAG RSS, rss란
웹에 홈페이지를 만들고 쉽다면 HTML 문법을 공부해야 하는 것 처럼 해당 컨텐츠를 RSS를 통하여 배포하고 싶다면 당연히 RSS 구문을 익히셔야 합니다. 다행인 것은 RSS 구문은 HTML 문법만큼 간단하여 쉽게 익힐 수 있습니다.

그러나 RSS를 사용함에 있어 알고 있어야 하는 것이 있습니다. RSS는 크게 두가지의 버전이 공존합니다. 간단함을 지향하는 RSS 0.9x,RSS 2.0좀 더 확장성이 강한 RSS 1.0 입니다. 두가지 버전 모두 동일한 기본 구조와 XML을 기반으로 하고 있습니다.

1. RSS의 내력 및 버전별 비교
RSS 0.9는 Netscape 사의 포털 서비스를 위한 다소 복잡한 형식으로 제작 되었고, 그 후에 웹블로그 제품과 기타 다른 제품에 사용을 위하여 UserLand Software에서 좀 더 간단한 RSS 0.91 발표하였습니다.

그 비슷한 시기에 RSS-DEV Working Group은 RDF(Resource Description Framework) 기반으로 한 RSS 1.0를 제작하였고, RSS 1.0 역시 RSS 0.9를 기본으로 하고 있습니다. 그 후에 UserLand 는 0.92,0.93.0.94 그리고 2.0을 발표하였습니다.

버전 제작 내용 사용
0.9 Netscape - 미사용
0.91 UserLand 간단함 공식버전 2.0 이나 많은 곳에서 사용되고 있슴
0.92,0.93,0.94 UserLand 0.91 보다 풍부한 metadata 제공 RSS 2.0 사용
1.0 RSS-DEV Working Group RDF를 기반으로 모듈을 통한 확장성 RDF 기반의 Application를 사용하거나 RDF 모듈이 필요할 경우
2.0 UserLand 모듈을 통한 확정성이 있고 0.9x 버전에서 쉽게 이전 가능 일반적인 자료 배포
2. RSS 2.0
RSS 2.0 이 RSS 0.9x 버전를 모두 포함하고 있기에 RSS 0.9x 버전에 대한 설명은 생략하도록 하겠습니다. 이전 버전에 대하여 관심이 있는 분들은 관련정보를 참고해 주십시요.

<?xml version="1.0" encoding="euc-kr" ?>
<rss version="2.0">
<channel>
<title>아이헬퍼스</title>
<link>http://www.ihelpers.co.kr</link>
<description>아이헬퍼스</description>
<language>ko</language>
<lastBuildDate>Nov, 15 2004 08:13:29 GMT</lastBuildDate>
<webMaster>smson@ihelpers.co.kr</webMaster>
<item>
<title>RSS에 대하여</title>
<link>http://www.ihelpers.co.kr/programming/lec.php?CMD=view&TYPE=1&IDX=245</link>
<author>손상모</author>
<pubDate>Nov, 15 2004 08:13:29 GMT</pubDate>
<category>강좌</category>
</item>
<item>
<title>게시판의 조회수를 정확하게 측정하자</title>
<link>http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=458</link>
<author>손상모</author>
<pubDate>Nov, 13 2004 01:33:48 GMT</pubDate>
<category>Tip&Tech</category>
</item>
<item>
<title>글자와 이미지에 Blink 효과주기</title>
<link>http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=457</link>
<author>손상모</author>
<pubDate>Nov, 12 2004 19:36:07 GMT</pubDate>
<category>Tip&Tech</category>
</item>
</channel>
</rss>
[ RSS 2.0 샘플 ]

Required channel elements

Element Description Example
title 채널명 ( 사이트명 또는 사이트의 메뉴명 ) 아이헬퍼스 - 새소식
link 웹사이트 URL 정보 또는 채널에 해당하는 웹사이트 URL 정보 http://www.ihelpers.co.kr
description 채널 설명 ( HTML 사용은 하지 않는 것이 좋다 ) 아이헬퍼스의 최식 소식

Optional channel elements

Element Description Example
language 채널에 사용한 언어 - 사용가능 언어 ko
copyright 채널정보에 대한 권한 Copyright ⓒ 2000-2004 iHelpers.
manageingEditor 채널 수정 담당자 이메일 주소 smson@ihelpers.co.kr (홍길동)
webMaster 채널 관련 문의 담당자 이메일 주소 webmaster@ihelpers.co.kr (홍길동)
pubDate 발행일자( RFC 822 형식 ) Nov, 15 2004 08:13:29 GMT
lastBuildDate 최종변경시간 Nov, 15 2004 08:13:29 GMT
category 채널이 속해 있는 카테고리 정보( 한개 이상 가능 ) 공지사항
generator 채널 생성 프로그램 EditPlus
docs RSS 형식에 대한 문서 URL http://blogs.law.harvard.edu/tech/rss
cloud <cloud domain="" port="" path="" registerProcedure="" protocol="" /> <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" />
ttl 채널정보 갱신 주기( 단위 : 분) <ttl>60</ttl>
image 이미지 정보( GIF,JPEG 또는 PNG )  
url 이미지 URL 정보  
title 이미지 설명,HTML의 IMG 태그의 ALT 구문과 동일  
width , height 넓이, 높이 ( 단위 : pixel ) width,height ( 최대, 기본 ) - 144/88,400/31
rating PICS Rating  
textInput CGI Script와 연계할 수 있는 Text Input 박스와 Submit Button 기능  
title Submit Button의 Label  
description Input 박스설명  
name Input 박스의 name  
link CGI Script URL  
skipHours Reader(Aggregator)가 채널정보를 읽지 않기 원하는 시간 0 ~ 23
skipDays Reader(Aggregator)가 채널정보를 읽지 않기 원하는 날짜 Monday,Tuesday,WednesDay...

Item Element

RSS 0.92까지는 아이템의 수가 제한 되어 있었으나 RSS2.0에 오면서 숫자에 제한이 없어 졌습니다. 아이템에 해당하는 모든 Element는 선택사항입니다.

Element Description Example
title 아이템 제목 스파이더 쫓아 버리기
link 아이템 URL 정보 http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=452
description 아이템에 대한 간략 설명( entity-encoded HTML ) robots.txt을 이용하여 Spider 사용 제한하기
author 작성자 이메일 주소 smson@ihelpers.co.kr
category 아이템 해당 카테고리(메뉴) 강좌
comments 아이템과 관련있는 URL 정보  
enclosure 아이템에 추가할 media 정보 <enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg" />
guid 유일한 식별문자 http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=452
pubDate 발행일자 Nov, 05 2004 22:53:27 GMT
source 출처 http://www.robotstxt.org/wc/robots.html
3. RSS 1.0
RSS 1.0에서 RSS는 "RDF Site Summary"를 의미합니다. RSS 1.0은 RDF를 사용하고 XML-Namespaces( RSS Modules )을 이용하여 큰 마찰 없이 확장을 가능하게 해 줍니다. 모듈로써는 Dublin Core Module이 가장 잘 알려져 있습니다. RSS 1.0은 아래의 샘플 코드에서 보는 것 처럼 RSS 0.9x 와 거의 비슷하나 몇가지 다른 요소를 가지고 있습니다.
  • <rdf:RDF>...<rdf:RDF> Element를 사용한다.
  • RSS 1.0는 'http://purl.org/rss/1.0' ( Default Namespace ), 'http://purl.org/dc/elements/1.1/' ( Dublin Core )과 같이 Namespace를 사용한다.
  • Item Element가 Channel Element 밖에서 사용된다. ( RSS 0.9x 의 경우는 Channel Element 내부에 있슴 )
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel rdf:about="http://www.xml.com/cs/xml/query/q/19">
    <title>XML.com</title>
    <link>http://www.xml.com/</link>
    <description>
	XML.com features a rich mix of information and services for the XML community.
	</description>
    <language>en-us</language>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.xml.com/pub/a/2002/12/04/normalizing.html"/>
        <rdf:li rdf:resource="http://www.xml.com/pub/a/2002/12/04/som.html"/>
        <rdf:li rdf:resource="http://www.xml.com/pub/a/2002/12/04/svg.html"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.xml.com/pub/a/2002/12/04/normalizing.html">
    <title>Normalizing XML, Part 2</title>
    <link>http://www.xml.com/pub/a/2002/12/04/normalizing.html</link>
    <description>
	In this second and final look at applying relational normalization techniques 
	to W3C XML Schema data modeling,Will Provost discusses when not to normalize, 
	the scope of uniqueness and the fourth and fifth normal forms.
	</description>
    <dc:creator>Will Provost</dc:creator>
    <dc:date>2002-12-04</dc:date>    
  </item>
  <item rdf:about="http://www.xml.com/pub/a/2002/12/04/som.html">
    <title>The .NET Schema Object Model</title>
    <link>http://www.xml.com/pub/a/2002/12/04/som.html</link>
    <description>
	Priya Lakshminarayanan describes in detail the use of the .NET Schema Object Model 
	for programmatic manipulation of W3C XML Schemas.
	</description>
    <dc:creator>Priya Lakshminarayanan</dc:creator>
    <dc:date>2002-12-04</dc:date>    
  </item>
</rdf:RDF>
[ RSS 1.0 샘플 ]

앞에서 이야기 한 것 처럼 두 버전 모두 장단점을 가지고 있습니다. 그러나 본인은 RSS를 "Really Simple Syndication" 에 무게를 더 두고 싶고, RSS 1.0은 부족하지만 여기서 마치도록 하겠습니다. 자세한 것은 관련정보의 자료를 참고하여 주십시요.

4. 관련정보
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
이번 시간 부터는 뉴스,블로그등의 사이트에서 제공하는 RSS 서비스를 읽는 RSS Reader를 제작하는 방법에 대하여 설명하도록 하겠습니다. RSS 서비스를 제공하는 것이 그렇게 어렵지 않지만 해당 서비스를 읽는 프로그램을 작성하는 것은 그렇게 쉽지 않습니다. PHP로 웹메일 솔루션을 구현하려고 할때 메일발송 부분은 간단하나 메일을 읽는 부분은 POP3,IMAP 프로토콜과 통신하고 인코딩(Base64,QP등)된 메일정보에 대한 디코딩처리와 같이 어려운 부분이 많은 것 처럼 말입니다.

다음은 RSS Reader의 주요 작업 순서입니다.

  1. RSS URL 정보로 HTTP 프로토콜 통신을 하여 정보를 얻어 온다.
  2. RSS 정보를 해당 버전에 맞게 파싱한다.
  3. 파싱된 정보를 Client( Web,Application )에 맞게 정보를 출력해 준다.

해당 강좌에서는 먼저 XML 기반의 RSS 문서를 파싱하는 방법에 대하여 설명하도록 하겠습니다.

아래의 rss.xml 파일은 아이헬퍼스에서 제공하는 RSS 서비스의 내용입니다. 여러분은 해당 구문을 어떻게 파싱하시겠습니까? 이번 강좌의 목표가 아래의 rss.xml 파일을 파싱하여 배열로 저장하는 것입니다.

<?xml version="1.0" encoding="euc-kr" ?>
<rss version="2.0">
<channel>
<title>아이헬퍼스</title>
<link>http://www.ihelpers.co.kr</link>
<description>아이헬퍼스</description>
<language>ko</language>
<lastBuildDate>Nov, 17 2004 06:51:58 GMT</lastBuildDate>
<webMaster>smson@ihelpers.co.kr</webMaster>
<item>
<title>RSS 강좌 - RSSWriter Class 제작 및 활용</title>
<link>http://www.ihelpers.co.kr/programming/lec.php?CMD=view&TYPE=1&IDX=247</link>
<author>손상모</author>
<pubDate>Nov, 17 2004 06:51:58 GMT</pubDate>
<category>강좌</category>
</item>
<item>
<title>RSS 강좌 - RSS 0.9x,2.0 그리고 1.0</title>
<link>http://www.ihelpers.co.kr/programming/lec.php?CMD=view&TYPE=1&IDX=246</link>
<author>손상모</author>
<pubDate>Nov, 16 2004 09:59:12 GMT</pubDate>
<category>강좌</category>
</item>
<item>
<title>RSS 강좌 - RSS에 대하여</title>
<link>http://www.ihelpers.co.kr/programming/lec.php?CMD=view&TYPE=1&IDX=245</link>
<author>손상모</author>
<pubDate>Nov, 15 2004 08:13:29 GMT</pubDate>
<category>강좌</category>
</item>
<item>
<title>게시판의 조회수를 정확하게 측정하자</title>
<link>http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=458</link>
<author>손상모</author>
<pubDate>Nov, 13 2004 01:33:48 GMT</pubDate>
<category>Tip&Tech</category>
</item>
<item>
<title>글자와 이미지에 Blink 효과주기</title>
<link>http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&IDX=457</link>
<author>손상모</author>
<pubDate>Nov, 12 2004 19:36:07 GMT</pubDate>
<category>Tip&Tech</category>
</item>
</channel>
</rss>

[ rss.xml ]
1. XML Parser function
XML(eXtensible Markup Language)은 인터넷과 같은 다양한 환경이 존재하는 곳에서 자료 교환을 위한 최선의 솔루션(형식)이며, 뉴스,날씨,증권등의 정보를 다양한 CP로 부터 얻어와야 하는 곳에서 많이 사용되고 있습니다. RSS는 이와 같은 XML의 가장 성공한 예입니다.

먼저 PHP에서 XML 구문 분석을 위한 "XML Parser function"에 대하여 알아보도록 하겠습니다. 대부분의 환경은 이미 "XML parser functions"이 설치 되어 있을 것이라고 생가합니다. 그러나 혹시 모르니 아래의 구문으로 설치여부를 점검해 주시고 설치가 되지 않은 분은 메뉴얼을 참고하여 주십시요.

$parser = @xml_parser_create();
if (!is_resource($parser)){
	die("Failed to create an instance of PHP's XML parser - 
			http://www.php.net/manual/en/ref.xml.php");
}

XML 주요 함수에 대한 자세한 설명은 메뉴얼 참고해 주시고, 여기서는 XML Parser 함수를 이용하여 날씨정보( http://www.kma.go.kr/weather/xml/current.xml )와 RSS 정보( rss.xml 파일)를 분석하는 방법을 예제를 통하여 배워 보도록 하겠습니다.

'weather.xml'은 날씨정보를 XML형식으로 제공하는 예입니다.아마도 패턴 매칭을 잘 사용하는 개발자의 경우에도 XML 문장들을 파싱하여 웹과 Application으로 서비스 하는 것은 그렇게 간단한 문제는 아닐 것입니다. 그러나 XML Parser 함수를 이용하면 주요 함수인(xml_parser_create, xml_set_element_handler, xml_set_character_data_handler)를 사용하여 간단하고 깔끔하게 원하는 정보를 얻어 올 수 있습니다.

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE current>
<current xmlns="current">
  <weather day="18" hour="17" month="11" year="2004">
    <local desc="맑음" icon="01" stn_id="101" ta="13.3">춘천</local>
    <local desc="맑음" icon="01" stn_id="102" ta="11.4">백령도</local>
    <local desc="맑음" icon="01" stn_id="105" ta="14.3">강릉</local>
    <local desc="구름조금" icon="02" rn_hr1="10" stn_id="108" ta="13.1">서울</local>
    <local desc="구름조금" icon="02" rn_hr1="25" stn_id="112" ta="12.5">인천</local>
    <local desc="구름조금" icon="02" stn_id="115" ta="11.9">울릉도</local>
    <local desc="구름조금" icon="02" rn_hr1="15" stn_id="119" ta="13.1">수원</local>
    <local desc="구름조금" icon="02" stn_id="131" ta="14.4">청주</local>
    <local desc="구름조금" icon="02" stn_id="133" ta="14.3">대전</local>
    <local desc="맑음" icon="01" stn_id="143" ta="15.4">대구</local>
    <local desc="맑음" icon="01" stn_id="146" ta="14.8">전주</local>
    <local desc="구름조금" icon="02" stn_id="152" ta="15.1">울산</local>
    <local desc="맑음" icon="01" stn_id="155" ta="15.7">마산</local>
    <local desc="맑음" icon="01" stn_id="156" ta="14.7">광주</local>
    <local desc="맑음" icon="01" stn_id="159" ta="14.4">부산</local>
    <local desc="맑음" icon="01" stn_id="184" ta="15.8">제주</local>
  </weather>
</current>

[ weather.xml ]

예제 코드 확인 : http://www.ihelpers.co.kr/lib/jmrss/weather.php

<?

function startElement($parser, $name, $attrs) {
	global $weather,$local,$stn_id;
	if($name == "WEATHER"){
		$weather = $attrs;
	} elseif($name == "LOCAL"){
		$stn_id = $attrs["STN_ID"];
		$local[$stn_id] = $attrs;
	}
}

function endElement($parser, $name) {
	global $stn_id;
	$stn_id = '';
}

function cdataHandler($parser, $cdata){
	global $local,$stn_id;
	if(!empty($stn_id)){ 
		$local[$stn_id]["value"] = $cdata;
	}
}

$file = "weather.xml";
$fp = fopen($file, "r") or die("$file not found");

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "cdataHandler");

$stn_id = '';
$weather = array();
$local = array();

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
			xml_error_string(xml_get_error_code($xml_parser)),
			xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

echo "<pre>";
print_r($weather); 
print_r($local);
echo "</pre>";
?>

[ weather.php ]

앞에서는 XML에 대한 이해를 위하여 날씨정보 XML 구문을 파싱하는 예제를 간단하게 소개하였습니다. RSS 구문도 XML 형식이기에 날씨정보에서와 같이 XML Parser function을 사용하여 간단하게 구문 분석을 할 수 있습니다. 음... 아래의 코드를 설명하려고 하니 뭘 설명해야 할지 모르겠군요. startElement,endElement 함수을 주의 깊게 보시고,직접 해당 함수로 이것 저것 해 보는 것이 가장 좋을 듯 하군요. ( 소스코드는 아래에 있으니 꼭 다운로드 받아서 직접 연습해 보십시요. )

<?
function startElement($parser, $name, $attrs) {
    global $depth;
    for ($i = 0; $i < $depth[$parser]; $i++) {
        print "  ";
    }
    print "$name
";
    $depth[$parser]++;
}

function endElement($parser, $name) {
    global $depth;
    $depth[$parser]--;
}

$file = "rss.xml";
$fp = fopen($file, "r") or die("$file not found");

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
			xml_error_string(xml_get_error_code($xml_parser)),
			xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
?>

[ rss.xml 파일에 대한 XML Parser function을 사용한 분석 예제 ]

2.RSSParser Class
RSSParser 클래스는 RSS구문을 분석하는 함수들과 분석된 배열정보를 호출하는 GET 함수로 구성되어 있습니다. 코드를 보시면 _create,_add 등과 같이 함수명 앞에 "_" 를 붙인 함수들을 보실 수 있을 것입니다.이것은 PHP가 접근제어자(public, private, protect )를 제공하지 않아 클래스 내부에서만 사용되는 함수에 대한 구분을 위해 사용하였습니다.

RSS Reader(Aggregator)를 만들기 위하여 RSSParser클래스와 앞으로 소개할 클래스들에 대하여 모두 이해하고 직접 제작할 필요는 없습니다. 이미 이와 관련되어 좋은 모듈들이 많이 나와 있고 해당 강좌에서 제시하고 있는 클래스들을 사용하시면 쉽게 제작을 할 수 있습니다. 빠르게 RSS Reader 기능을 구현하고 싶은 분들은 아래의 샘플코드에 대한 이해만으로도 충분히 구현을 하실 수 있을 것입니다. RSS에 대하여 깊게 이해 하고 싶은 분들은 제시된 클래스 구문을 분석하시면 많은 도움이 될 것입니다.

<?
/*///////////////////////////////////////////////////////////////

작성자	: 손상모<smson@ihelpers.co.kr>
최초작성일	: 2004.10.25
변경내용	: 없슴

/////////////////////////////////////////////////////////////////*/

/**
* RSS parser class.
*
* This class is a parser for Resource Description Framework (RDF) Site
*
* @author Sang Mo,Son <smson@ihelpers.co.kr>
* @version 0.9 beta
* @access  public
*/
class RSSParser {

	var $parser;

	var $insideTag	= '';
	var $activeTag	= '';
	var $channel	= array();

	var $items		= array();
	var $item		= array();

	var $images	= array();
	var $image		= array();

	var $textinput	= array();
	var $textinputs	= array();

	// 2004.10.25 RSS 2.0 적용
	var $parentTags	= array('CHANNEL', 'ITEM', 'IMAGE', 'TEXTINPUT');
	var $channelTags	= array('TITLE', 'LINK', 'DESCRIPTION', 'LANGUAGE','COPYRIGHT','MANAGINGEDITOR',
			'WEBMASTER','PUBDATE','LASTBUILDDATE','CATEGORY','GENERATOR','DOCS','CLOUD',
			'TTL','RATING','SKIPHOURS','SKIPDAYS','IMAGE','ITEMS', 'TEXTINPUT');
	var $itemTags	= array('TITLE', 'LINK', 'DESCRIPTION',
			'AUTHOR','CATEGORY','COMMENTS','ENCLOSURE','GUID','PUBDATE','SOURCE');
	var $imageTags	= array('TITLE', 'URL', 'LINK','WIDTH','HEIGHT','DESCRIPTION');
	var $textinputTags = array('TITLE', 'DESCRIPTION', 'NAME', 'LINK');
	var $moduleTags	= array('DC:TITLE', 'DC:CREATOR', 'DC:SUBJECT', 'DC:DESCRIPTION',
			'DC:PUBLISHER', 'DC:CONTRIBUTOR', 'DC:DATE', 'DC:TYPE',
			'DC:FORMAT', 'DC:IDENTIFIER', 'DC:SOURCE', 'DC:LANGUAGE',
			'DC:RELATION', 'DC:COVERAGE', 'DC:RIGHTS',
			'BLOGCHANNEL:BLOGROLL', 'BLOGCHANNEL:MYSUBSCRIPTIONS',
			'BLOGCHANNEL:MYSUBSCRIPTIONS', 'BLOGCHANNEL:CHANGES');

	/**
	 * Constructor
	 *
	 * @access	public
	 * @return	void
	 */
	function RSSParser(){
		$this->_create();
	}

	/**
	 * create the XML parser resource
	 *
	 * @access  private
	 * @return	boolean
	 *
	 * @see		xml_parser_create
	 */
	function _create(){
		$this->parser = @xml_parser_create();
		if (is_resource($this->parser)) {
			xml_set_object($this->parser, &$this);
			xml_set_element_handler($this->parser, "startHandler", "endHandler");
			xml_set_character_data_handler($this->parser, "cdataHandler");
			return true;
		}
		return false;
	}

	/**
	 * Free the internal resources associated with the parser
	 * 
	 * @return null
	 **/
	function free(){
		if (is_resource($this->parser)) {
			xml_parser_free($this->parser);
			unset( $this->parser );
		}
		return null;
	}

	/**
	 * Start element handler for XML parser
	 *
	 * @access private
	 * @param  object XML parser object
	 * @param  string XML element
	 * @param  array  Attributes of XML tag
	 * @return void
	 */
	function startHandler($parser, $element, $attr){
		switch ($element) {
			case 'CHANNEL':
			case 'ITEM':
			case 'IMAGE':
			case 'TEXTINPUT':
				$this->insideTag = $element;
				break;

			default:
				$this->activeTag = $element;
		}
	}

	/**
	 * End element handler for XML parser
	 *
	 * @access private
	 * @param  object XML parser object
	 * @param  string
	 * @return void
	 */
	function endHandler($parser, $element){
		if ($element == $this->insideTag) {
			$this->insideTag = '';
			$this->struct[] = array_merge(array('type' => strtolower($element)),
					$this->last);
		}

		if ($element == 'ITEM') {
			$this->items[] = $this->item;
			$this->item = '';
		}

		if ($element == 'IMAGE') {
			$this->images[] = $this->image;
			$this->image = '';
		}

		if ($element == 'TEXTINPUT') {
			$this->textinputs = $this->textinput;
			$this->textinput = '';
		}

		$this->activeTag = '';
	}

	/**
	 * Handler for character data
	 *
	 * @access private
	 * @param  object XML parser object
	 * @param  string CDATA
	 * @return void
	 */
	function cdataHandler($parser, $cdata){
		if (in_array($this->insideTag, $this->parentTags)) {
			$tagName = strtolower($this->insideTag);
			$var = $this->{$tagName . 'Tags'};

			if (in_array($this->activeTag, $var)){
				$this->_add($tagName, strtolower($this->activeTag),$cdata);
			} elseif(in_array($this->activeTag, $this->moduleTags)) {
				$this->_add($tagName, strtolower($this->activeTag),$cdata);
			}
		}
	}

	/**
	 * Add element to internal result sets
	 *
	 * @access private
	 * @param  string Name of the result set
	 * @param  string Fieldname
	 * @param  string Value
	 * @return void
	 * @see    cdataHandler
	 */
	function _add($type, $field, $value)
	{
		if (empty($this->{$type}) || empty($this->{$type}[$field])) {
			$this->{$type}[$field] = $value;
		} else {
			$this->{$type}[$field] .= $value;
		}
		$this->last = $this->{$type};
	}

	/**
	 * Central parsing function.
	 *
	 * @access	public
	 * @param	string	XML Content
	 * @return	boolean
	 */
	function parse($data){
		xml_parse($this->parser,$data);
		return true;
	}

	/**
	 * Get complete structure of RSS file
	 *
	 * @access public
	 * @return array
	 */
	function getStructure()
	{
		return (array)$this->struct;
	}

	/**
	 * Get general information about current channel
	 *
	 * @access public
	 * @return array
	 */
	function getChannel()
	{
		return (array)$this->channel;
	}

	/**
	 * Get items from RSS file
	 *
	 * @access public
	 * @return array
	 */
	function getItems()
	{
		return (array)$this->items;
	}

	/**
	 * Get images from RSS file
	 *
	 * @access public
	 * @return array
	 */
	function getImages()
	{
		return (array)$this->images;
	}

	/**
	 * Get text input fields from RSS file
	 *
	 * @access public
	 * @return array
	 */
	function getTextinputs()
	{
		return (array)$this->textinputs;
	}
}
?>

[ RSSParser Class 코드 ]

<?
require "RSSParser.php";

$file = "rss.xml";
$fp = fopen($file, "r") or die("$file not found");
while (!feof ($fp)) {
    $buffer .= fgets($fp, 4096);
}
fclose ($fp);

$rss = new RSSParser();
$rss->parse($buffer);
echo "<pre>";
print_r($rss->getStructure());
print_r($rss->getChannel());
print_r($rss->getItems());
echo "</pre>";
?>

[ RSSParser Class을 이용한 샘플코드 ]

예제 코드 확인 : http://www.ihelpers.co.kr/lib/jmrss/demoRSSParser.php
3. 소스코드
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
제목 RSS 강좌 - PEAR를 이용한 RSS 기능 구현
작성자 손상모 작성일 2004.11.20 15:39:55
첨부파일 pearreader.zip(0.93KB)


RSS강좌 목표가 RSS Reader(Aggregator) 구현보다는 RSS에 대한 이해이다 보니 너무 깊게 설명하여, 단순하게 RSS 기능 구현이 목적인 분들은 좀 복잡하다 생각하실 수 있을 것 같아, 이번시간에는 RSS 모듈을 통하여 개발자가 쉽게 RSS를 사용하는 방법을 소개하려고 합니다.

앞의 강좌에서 사용한 RSSReader 클래스( 꽤 쓸만함) 사용하는 것도 좋지만, PHP에는 PEAR(PHP Extension and Application Repository)라는 아주 좋은 솔루션이 있습니다. 그럼 PEAR에 대한 간략한 소개와 PEAR 중의 XML/RSS 클래스 사용방법을 알아 보도록 하겠습니다.

1. PEAR 소개
PEAR는 "PHP Extension and Application Repository" 의 약자로써 Malin Bakken에 의하여 1999.11.12에 시작하여, 현재는 다양한 클래스등을 제공하여 PHP 개발자들이 좀 더 편리하게 개발할수 있는 환경을 제공하고 있습니다.

PHP 설치시 기본적으로 PEAR가 설치지 않기에( 버전과 설치 옵션에 따라서 차이가 있슴)  여러분의 시스템에 현재 PEAR가 설치되어 있지 않을 수 있습니다. PEAR의 설치와 보다 자세한 설명은 아래의 사이트를 참고하여 주십시요.

2. XML/RSS 설치 및 메뉴얼
PEAR 클래스 중에서 XML_RSS를 설치해 보도록 하겠습니다. 사이트에서 직접 소스를 다운로드 받아서 설치하거나, 아님 아래의 예처럼 온라인상에서 바로 설치도 가능합니다. "pear" 의 사용방법은 "c:pearpear help" 로 pear 명령어들에 대한 간단한 설명을 볼수 있습니다.

  • pear list -> 서버에 설치되어 있는 목록을 보여줍니다.
  • pear remote-list -> pear.php.net 에 있는 Package 리스트를 보여줍니다.
  • pear install packagename -> Package를 설치해줍니다.
  • pear uninstall packagename -> Package를 설치해줍니다.
  • pear remote-info packagname -> pear.php.net 에 있는 Package 정보를 보여 줍니다.
C:php>pear install XML_RSS
downloading XML_RSS-0.9.2.tgz ...
Starting to download XML_RSS-0.9.2.tgz (3,515 bytes)
....done: 3,515 bytes
requires package `XML_Tree'
XML_RSS: Dependencies failed

C:php>pear install XML_Tree
downloading XML_Tree-1.1.tgz ...
Starting to download XML_Tree-1.1.tgz (4,826 bytes)
.....done: 4,826 bytes
install ok: XML_Tree 1.1

C:php>pear install XML_RSS
downloading XML_RSS-0.9.2.tgz ...
Starting to download XML_RSS-0.9.2.tgz (3,515 bytes)
....done: 3,515 bytes
install ok: XML_RSS 0.9.2


C:phpPEAR>cd XML
C:phpPEARXML>dir
C 드라이브의 볼륨: 로컬 디스크
볼륨 일련 번호: 58B7-06FB

C:phpPEARXML 디렉터리

2004-11-20  02:07p      <DIR>          .
2004-11-20  02:07p      <DIR>          ..
2004-11-20  02:07p      <DIR>          Parser
2004-11-20  02:07p              18,932 Parser.php
2004-10-22  04:14p      <DIR>          RPC
2004-10-22  04:14p              34,992 RPC.php
2004-11-20  02:02p               8,718 RSS.php
2004-11-20  02:02p      <DIR>          Tree
2004-11-20  02:02p              10,028 Tree.php

4개 파일          72,670 바이트
5 디렉터리   9,076,826,112 바이트 남음

PEAR 메뉴얼 : http://pear.php.net/manual/en/package.xml.xml-rss.php

3. RSS Reader 기능 구현
XML/RSS Package 사용에 대한 간단한 예와 "RSS강좌 - RSSReader Class 제작 및 Reader 만들기"에서 구현한 간단한 RSS Reader를 XML_RSS을 이용하여 구현해 보도록 하겠습니다. 코드들은 앞의 강좌에서 소개한 코드들과 거이 차이가 없고 간단하니 별도의 설명은 하지 않겠습니다.

<?
require_once "XML/RSS.php";

$rss =& new XML_RSS("http://www.ihelpers.co.kr/rss.php?q=all");
$rss->parse();

echo "<pre>";
print_r($rss->getStructure());
print_r($rss->getChannelInfo());
print_r($rss->getItems());
echo "</pre>";
?>

[ demopear.php ]

<?
require_once "XML/RSS.php";

$url = $HTTP_GET_VARS["URL"];

$rss =& new XML_RSS("http://www.ihelpers.co.kr/rss.php?q=all");
$rss->parse();


echo "<html><head><title>Simple RSS Reader</title>
";
echo "<style><!-- BODY,TD,SELECT { FONT: 9pt Arial; LINE-HEIGHT: 17px;} //--></style>
";
echo "<body><form>RSS URL : <input type=text name=URL value="$url" size=70> ";
echo "<input type=submit value="?">
";
echo "<hr>
";
echo "</form>
";

if(!empty($url)){
	$channel = $rss->getChannelInfo();
	while (list($key, $value) = each ($channel)) {
		echo "<li>$key => $value</li>
";
	}

	echo "<p><table width=100%>";
	$count = 0;
	foreach($rss->getItems() as $items){
		
		if($count == 0){
			echo "<tr>";
			while (list($key, $value) = each ($items)) {
				printf("<td bgcolor="#EEEEEE">%s</td>
",$key);
			}
			echo "</tr>";
		}

		echo "<tr>";
		while (list($key, $value) = each ($items)) {
			printf("<td bgcolor="#F7F7F7">%s</td>
",$value);
		}
		echo "</tr>";
		
		$count++;
	}
	echo "</table>";
}
echo "</body></html>
";
?>

[ pearreader.php ]

3. 소스코드

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
제목 RSS 강좌 - RSS로 만드는 뉴스서비스
작성자 손상모 작성일 2004.11.22 16:11:50
첨부파일 newsmowa.zip(8.96KB)


구글은 검색엔진 기술을 이용하여 웹상의 뉴스정보를 모와서 뉴스서비스(http://www.google.co.kr/news)를 제공하고 있습니다. 이미 야후,네이버등에서 제휴를 통하여 뉴스 서비스를 제공하고 있고, 구글의 뉴스 정보는 링크를 통하여 해당 사이트에서 내용 조회해야 하는 불편함등으로 이용자가 미약하지만, 검색엔진 기술만으로 많은 뉴스정보를 종합적으로 볼수 있다는 것은 참 좋은 것 같습니다. 갑자기 구글의 뉴스이야기를 한 것은 이번시간에 우리는 검색기술이 아닌 RSS를 이용하여 뉴스정보를 제공하는 서비스를 만들어 보기 위해서 입니다.

1. 데모보기

http://www.ihelpers.co.kr/lib/jmrss/newsmowa.php

2. newsmowa.php 소스
라이브러리는 앞에서 소개한 "RSSReader Class"를 사용하였으면, 강좌를 보시는 분들이 코드를 최대한 쉽게 이해하고 다른곳의 활용도를 높이기 위해서 부가적인 기능이 없이 간락하게 코드를 구성해 보았습니다.

프로그램의 주요 기능은 아래와 같습니다.

  1. 각 사이트별로 뉴스 정보를 읽어온다.
  2. 읽어온 뉴스정보를 날짜순으로 정열한다.
  3. 정열된 뉴스정보를 출력해 준다.
$rss = new RSSReader($url,true,600,"./cache");

빠른 조회를 위하여 Cache기능을 사용하였으며, Cache 주기는 10분 단위로 설정하였습니다. cache 디렉토리는 아래와 같이 사전에 생성해 주어야 합니다.

lsh804:~/www/lib/jmrss$ mkdir cache
lsh804:~/www/lib/jmrss$ cd cache/
lsh804:~/www/lib/jmrss/cache$ ls -al			-- 실행전(브라우저 호출전)
total 8
drwxr-xr-x    2 ihelpers ihelpers     4096 11¿u 22 13:22 ./
drwxrwxr-x    3 ihelpers ihelpers     4096 11¿u 22 13:22 ../

lsh804:~/www/lib/jmrss/cache$ ls -al			-- 실행후(브라우전 호출후)
total 84
drwxr-xr-x    2 ihelpers ihelpers     4096 11¿u 22 13:23 ./
drwxrwxr-x    3 ihelpers ihelpers     4096 11¿u 22 13:22 ../
-rw-r--r--    1 ihelpers ihelpers    26480 11¿u 22 13:23 75d78ac73c4bba613383c14364d7cad9
-rw-r--r--    1 ihelpers ihelpers    10296 11¿u 22 13:23 80f7c3964eb777b3c13a1abeae98aaba
-rw-r--r--    1 ihelpers ihelpers    35870 11¿u 22 13:23 cf7ea8604a12ee1ef2887dc93e53d052
lsh804:~/www/lib/jmrss/cache$ 

아래는 RSS를 통하여 얻은 뉴스정보를 최근날짜별로 정열하는 로직입니다. 날짜순 정열을 위하여 발행일을 "YmdHis" 형식의 날짜일련번호 항목을 별도로 저장하였습니다.

/**
 * 날짜별로 정열
 *
 * @access private
 * @return void
 */
function cmp ($a, $b) {
 return strcmp($b["IDXPUBDATE"],$a["IDXPUBDATE"]);
}
...
usort($newsList,"cmp");

<?
include "RSSReader.php";

/**
 * GMT 날짜를 현지 날짜로 변경한다.
 *
 * @access private
 * @param string pubdate
 * @return string
 */
function _TopubDate($pubdate,$fmt = "Y/m/d H:i:s"){
 $result = strtotime($pubdate);
 if($result > 0){
  return date($fmt,$result);
 } else {
  if(preg_match("/(d{4})-(d{2})-(d{2})T(d{2}):(d{2})(:(d{2})|)([-|+])(d{2}):(d{2})/",
   $pubdate,$matches)){
   $op = ($matches[8] == "-")? -1:1;
   $hour = $matches[9]*$op;
   $min  = $matches[10]*$op;
   $timestamp =
    mktime ($matches[4]+$hour,$matches[5]+$min,$matches[6],$matches[2],$matches[3],$matches[1]);
   return date($fmt,$timestamp);
  } else {
  }
 }
}

/**
 * 날짜별로 정열
 *
 * @access private
 * @return void
 */
function cmp ($a, $b) {
 return strcmp($b["IDXPUBDATE"],$a["IDXPUBDATE"]);
}

/**
 * 뉴스목록의 선택여부
 *
 * @access private
 * @param string news key
 * @return boolean
 */
function isChoice($key){
 global $ns;
 return in_array($key,$ns);
}


$news = array(
 "chosun" => array("조선일보","http://www.chosun.com/rss/rss.xml"),
 "joins" => array("중앙일보","http://rss.joins.com/joins_news_list.xml"),
 "kbench" => array("케이벤치","http://rss.kbench.com/news.xml")
);

$ns = $HTTP_GET_VARS["ns"];
if(empty($ns)){ $ns = array_keys($news); }

$newsList = array();
while (list($key, $value) = each ($news)) {
 $url = $value[1];
 $rss = new RSSReader($url,true,600,"./cache");
 $response = $rss->Read();

 foreach($rss->getItems() as $item){

  if(isChoice($key)){
   if(isset($item["dc:date"])) $item["pubdate"] = $item["dc:date"];
   //array_push($newsList,array($value[0],$item["title"],$item["link"],$item["description"],$item["pubdate"]));
   array_push($newsList,
    array(
     NAME => $value[0],
     TITLE => $item["title"],
     LINK => $item["link"],
     DESCRIPTION => $item["description"],
     PUBDATE => $item["pubdate"],
     TOPUBDATE => _Topubdate($item["pubdate"]),
     IDXPUBDATE => _Topubdate($item["pubdate"],"YmdHis")
    )
   );
  }
 }

 $rss->free();
 unset($rss);
}

usort($newsList,"cmp");

echo "<html><head><title>뉴스모와</title> ";
echo "<style><!-- BODY,TD,SELECT { FONT: 9pt Arial; LINE-HEIGHT: 17px;} //--></style> ";
echo "<body>";
echo "<form>";
echo "<table width=100% border=1> ";
echo "<tr><td> ";


foreach($news as $key => $value) {
 $checked = isChoice($key)? "checked":"";
 echo "<input type=checkbox name=ns[] value=$key $checked> $value[0] ";
}

echo "<input type=submit value="조회"></td></tr> ";
echo "</table>";
echo "</form>";

echo "<table width=100% border=1> ";
echo "<tr><td>제목</td><td align=center>발행일</td><td align=center>출처</td></tr> ";
foreach($newsList as $list){
 printf("<tr><td><a href="%s" target=_blank>%s</td><td align=center>%s</td><td align=center>%s</td></tr> ",
  $list[LINK],$list[TITLE],$list[TOPUBDATE],$list[NAME]);
}
echo "</table>";

echo "</body></html> ";
?>

3. 소스코드

이것으로 RSS 연재 강좌를 마치도록 하겠습니다. 아직 국내의 경우는 RSS 활용과 자료가 적어, 부족한 실력이지만 관련 클래스와 강좌를 연재하게 되었습니다.  이 강좌를 보시고 많은 분들이 운영하는 사이트에 RSS를 제공하고, RSS 관련된 좋은 솔루션과 서비스 제작하는데 조금이나마 도움이 되었으면 합니다.

 

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이