- ISSUE
- 뉴스정보
- 주식정보
- 유용한정보
- 포트폴리오
- 각종분석법
- 투자에 도움이 되는 글
- 가치투자재테크
- 로또645
- 로또마을
- 컴퓨터팁&테크
- 자격증&강좌모음
- 블로그팁&테크
- 스포츠종합
- 주식잡동사니
- 잡동사니
- 리치
인기 검색어

[인터리치]
쉬운돈벌기 제공 + 수익금지원
로또분석-플러스645
좋은책 모닝365
:+:+:+::[UCC 위젯 퍼가기]::+:+:+:
http://blog.naver.com/jeffyang?Redirect=Log&logNo=150015990703
언제부터인지 우리 주위에 Rss라는 단어가 많이 익숙해져 있습니다.
블로그, 뉴스, 도서 사이트 심지어 UCC까지 WEB2.0시대인 요즘은 원하는 정보를 Rss 서비스로 받아 보실 수 있습니다.
이러한 Rss 피드를 모아서 편하게 구독하게 해 주는 것이 일명 Rss Reader입니다.
Rss Reader에는 웹 기반의 Rss Reader, 설치형 Rss Reader, 동기화 가능 설치형 Rss Reader이 있습니다.
이러한 것들을 구현하기 위해서는 수집, 정렬, 검색, 동기화 등등 많은 기술들이 들어 갑니다.
하지만 버뜨~ 이 post의 제목이 초간단 Rss Reader입니다.
제목에 충실히 인터넷 연결이 되어 있고 IE가 깔려 있으면(흠 이부분은 나중에 이야기 드릴께요 ㅠㅠ) 단순히 해당 피드 주소만 넣으면 읽기만 가능한 그러한 Reader를 만들어 보겠습니다.
누군가 그랬습니다. Simple is The Best....
사실 실력이 요까지라서 더 복잡한건 ..... OTL
초간단 Rss Reader를 구현하기 위한 기본적인 지식으로 Javascript, html, xml의 기본적인 지식이 필요합니다.
Javascript의 경우 prototype.js를 기본으로 하여 이미 구현한 라이브러리를 최대한 이용하도록 하겠습니다.
prototype.js는 URL : http://www.prototypejs.org 에서 다운 받으실 수 있으며
http://blog.naver.com/jeffyang/150015619963 에 가시면(post 자랑 ^^;) 한글로 된 메뉴얼의 링크를 얻으실 수 있습니다.
이 Post 작성하는 순간에 버전이 1.51 RC1으로 올랐습니다.
이번 버전에는 XML노드를 처리하기 위한 라이브러리가 보이는 군요.
애써 외면하며 여기서는 prototype 1.5를 기준으로 하겠습니다.
간략한 post의 순서입니다.
1. Rss를 분석하여 어떤 elements를 가지고 표현할 것인지 결정 합니다.
2. Rss를 XML로 받아 옵니다. 이 부분은 Javascript의 XMLHttpRequest객체를 가지고 구현을 합니다.
3. 받아온 XML을 파싱해야 합니다. 이 부분 역시 Javascript JSON 포멧으로 파싱 합니다.
4. JSON을 받아서 화면이 html코드로 이쁘게 뿌려 주면 간단 RssReader의 완성 입니다.
Javascript, html, xml로만 하겠다고 해 놓고 JSON이란 놈이 보이는 군요.
JSON은 JavaScript Object Notation 라 불리우는 경량의 DATA 교환 형식입니다.
Javascript 맞죠!!! 네 분명 Javascript Object라고 했습니다. JSON에 대해서 더 자세히 알고 싶으신 분은
URL : http://json.org/json-ko.html 을 참고 하세요. 한글로 잘 설명되어 있습니다.
평소 영어를 외계어로 여기는 까닭에 해석하시는 수고를 덜어 드리고자 이렇게 친절하게 한글주소로 안내를 해 드립니다.
이쯤에서 첫번째 주제 Rss를 분석해 보도록 하겠습니다.
현재 국내에서 가장 많이 사용되고 있는 것이 Rss 2.0 포멧입니다. 그리고 Rss 1.0, ATOM 포멧도 많이 보입니다.
솔직히 웬만한 사이트들은 모두 Rss 2.0을 지원해 줍니다. 하지만 국내 사이트들 중에는 무늬만 Rss 2.0이고 표준을 지키지 않은 곳들이 많이 있습니다.
표준을 준수하지 않은 경우는 해당 Rss서비스에 맞도록 하나씩 처리를 해 줘야 합니다.
필수 Elements가 빠진곳이나 엉뚱한 Elements가 나타나는 곳들도 종종 있었습니다.
한국에서 구글이 힘을 못쓰는 이유는 포탈 및 대형 사이트 들의 비표준이 지대한 공헌을 했다고 하더군요. (공감 100% 입니다.)
어찌 되었건 한국어로 된 Rss 서비스를 받고자 한다면 이 정도 수고는 해야 하는군요. ㅠㅠ
이러한 비표준을 처리하기 위해서 prototype.js의 Try.these 구문을 이용 했습니다.
1. RSS 2.0 분석
Rss란 무엇인가?
한국정보통신기술위원회의 문서를 빌리자면
RSS 는 웹 컨텐츠 신디케이션 형식으로 Really Simple Syndication 의 약자이다.
컨텐츠 신디케이션(Content Syndication)이란 사이트 컨텐츠의 일부 또는 전체를 다른 서비스에서 이용할 수 있도록 해주는 것을 말한다.
신디케이션된 컨텐츠(또는 feed)는 컨텐츠 자체와 메타데이타 로 구성된다. 이러한 feed 에는 헤드라인 내용만 있을 수도 있고, 스토리에 대한 링크만 있을 수도 있으며, 사이트의 전체 컨텐츠가 포함될 수도 있다.
근래에 들어 특히 1 인 미디어인 블로그(blog)를 중심으로 컨텐츠 신디케이션 표준인 RSS 의 가능성을 확인되면서, 다양한 응용들이 등장하고 있고, 차세대 웹 콘텐츠 유통 기술의 핵심 표준으로 주목받고 있다.
뭔 소린지 잘 모르겠습니다. 그냥 구조를 한번 살펴 보죠.
대략 다음과 같은 구조로 되어 있습니다. 이중 굵게 처리된 것들은 필수 요소 입니다.
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>
어렵습니다. ㅠㅠ.
이것만 봐서는 눈에 잘 안 들어 옵니다. 그래서 IE 7.0의 피드랑 비교해서 각 항목을 알아 보겠습니다.

화면을 보아 하니 <channel>에서 시작해서 </channel>로 닫히는군요.
<channel>아래에 있는 <link><title><pubDate>도 대충 어떤 놈인지 알겠습니다.
중간에 <image>도 보이구 <category>도 보입니다.
<item>에서 시작해서 </item>까지가 한개의 post 로 구분되어 있습니다.
<item>아래에는 <link><title><pubDate><description>이 보이네요..
가져올 elements를 구분하겠습니다.
피드의 title과 link, pubDate(없으면 lastBuildDate)를 가져와서 있는놈들을 큰 제목에 뿌려 주고
item을 배열로 돌리면서 item의 자식들 link, title, pubDate, desciption 중 있는놈들을 모두 뿌려 주겠습니다.
[출처] Javascript 를 이용한 초간단 Rss Reader 구현하기 (1)|작성자 루틴
2. Rss를 XML로 가져오기
이제 가져올 element는 정해 졌습니다.
하지만 한가지 문제가 있습니다. 이놈을 어떻게 가져 올 것인가???
Ajax라고 많이 들어 보셨을 것입니다. 일명 HTML, Javascript DHTML, DOM으로 구성된 비동기 통신을 가리키는 말입니다.
Ajax의 핵심에는 XMLHttpRequest 가 있습니다. 대충 보니 HTTP프로토콜을 이용하여 XML로 어떤 값을 받는거 같습니다.
이놈이 사용자가 눈치채지 못하게 어떤 값을 가져오고 그것을 DOM형태로 소리 소문 없이 문서 사이에 끼워 넣으면서 여러가지 동적인 화면을 구성할 수 있습니다.
Ajax에 대해서 더 자세히 아시고 싶으신 분은
URL : http://www.ibm.com/developerworks/kr/library/wa-ajaxintro1.html 를 참고해 주세요.
이 Post의 주제가 초간단 Rss Reader를 만드는 것이기 때문에 주제에 충실 하도록 하겠습니다.
이제 보실 부분은 rssReader.html의 javascript 부분입니다.
총 3개의 function으로 구성되어 있습니다.
uriChk()
입력한 URL값이 유효한 값인지 검사 합니다. 최소한 http://XXX.XXX 나 https://XXX.XXX 형태가 되는지 검사합니다.
여기를 통과하면 일단 유효한 URL이라고 판단하여 getRss(URL)을 호출 합니다.
getRss(URL)
이부분이 핵심입니다. 해당 URL로 Ajax비동기 통신을 하여 xml을 가져 옵니다.
그리고 var xml = rssParser(req.responseXML); 로 xml을 JSON으로 파싱을 시킵니다.
rssParser은 rssParser.js란 include된 javascript에 들어 있습니다.
만약 알맞게 JSON으로 파싱이 되었다면 printHTML(JSON) 을 호출 합니다.
printHTML(JSON)
이 부분은 그냥 이뿌게 꾸며서 <div id="title"></div> 여기에 제목 부분을 넣고
<div id="contents"></div> 여기에 item 리스트를 넣는 것입니다.
전체 소스를 보겠습니다.
0: <?xml version="1.0" encoding="EUC-KR" ?> 1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2: <html xmlns="http://www.w3.org/1999/xhtml"> 3: <head> 4: <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR" /> 5: <style type="text/css"> 6: * {font-size:12px;} 7: body {margin:0px; padding:0px;color:#666666;} 8: a:active {color:#236fa5; text-decoration:none;} 9: a:visited {color:#236fa5; text-decoration:none;} 10: a:link {color:#236fa5; text-decoration:none;} 11: a:hover {color:#518fbb; text-decoration:underline;} 12: </style> 13: <script type="text/javascript" language="javascript" src="./prototype.js"></script> 14: <script type="text/javascript" language="javascript" src="./rssParser.js"></script> 15: <script type="text/javascript" language="javascript"> 16: <!-- 17: function uriChk() { 18: var uri = $("uri"); 19: if(uri.value == "") { 20: alert("가져올 피드의 주소를 입력 하세요."); 21: uri.focus(); 22: return; 23: } 24: if(!(/(http|https):\/\/\w+([-.]\w+).+$/).test(uri.value)) { 25: alert("피드 주소가 유효하지 않습니다."); 26: uri.focus(); 27: return; 28: } 29: getRss(uri.value); 30: } 31: 32: function getRss(uri) { 33: Element.hide("title"); 34: $("contents").innerHTML = $("loading").innerHTML; 35: new Ajax.Request( 36: uri, 37: { 38: method : "get", 39: onSuccess : function(req) { 40: var xml = rssParser(req.responseXML); 41: if(!xml) {
alert("Rss포멧이 아닙니다.");
$("contents").innerHTML = "";
return;
} 42: printHtml(xml); 43: }, 44: onFailure : function() { 45: alert("데이타를 가져오는데 실패 했습니다."); 46: $("contents").innerHTML = ""; 47: } 48: } 49: ); 50: } 51: 52: function printHtml(xml) { 53: var d = new Date(xml.pubDate); 54: var title = ''; 55: var cont = ''; 56: title += '<a href="' + xml.link + '" target="_blank"><strong style="font-size:16px;">'
+ xml.title + '</strong></a>'; 57: if(d != 'NaN') { 58: title += '<span style="padding-left:20px;">(' + d.toLocaleString() + ')</span>'; 59: } 60: title += '<br/><br/>' + xml.description; 61: for(var i = 0; i < xml.item.length; i++) { 62: cont += '<a href="' + xml.item[i].link +'" target="_blank">'
+ '<strong style="font-size:16px;">' + xml.item[i].title + '</strong></a>'; 63: cont += '<hr style="height:1px;color:518fbb"/>'; 64: if(xml.item[i].pubDate != "") { 65: var pd = new Date(xml.item[i].pubDate); 66: cont += '<span style="color:#aaaaaa;">' + pd.toLocaleString()
+ '</span><br/><br/>'; 67: } 68: cont += xml.item[i].description.replace("\n", "<br/>") + '<br/><br/><br/>'; 69: }; 70: $("title").innerHTML = title; 71: $("contents").innerHTML = cont; 72: Element.show("title"); 73: } 74: //--> 75: </script> 76: <title>Rss Reader V 0.1 by Vricks - www.vricks.com</title> 77: </head> 78: <body> 79: <div style="width:800px;text-align:left;margin:auto;"> 80: <div style="background-color:#ff000a;padding:16px 0 50px 16px;margin:20px 0;"> 81: <strong style="font-size:14px;color:#ffffff;"> 82: Rss Reader V0.1 83: </strong> 84: </div> 85: <div style="text-align:center;margin:20px;"> 86: <input type="text" id="uri" value="http://blog.rss.naver.com/jeffyang.xml"
style="width:360px;" /> 87: <input type="button" value="RSS 가져오기" onclick="uriChk();" /> 88: </div> 89: <div id="title"
style="padding:20px;background-color:#f7f7f4;border:1px solid #aaaaaa;display:none;">
</div> 90: <div id="contents" style="padding:20px;"></div> 91: <div style="display:none;" id="loading"><div style="text-align:center;">
<img src="./loading.gif" alt=""/>
</div></div> 92: </div> 93: </body> 94: </html>
$("uri") -> API 보기
document.getElementById("uri")와 같은 말입니다. 물론 $()함수는 더 많은 기능을 제공해 줍니다.
Element.hide("title"); -> API 보기
document.getElementById("title").style.display = ""; 과 같은 말입니다. 물론 Element.hide("title") 함수가 더 많은 기능을 제공합니다.
var myAjax = new Ajax.Request(
url,
{
method: 'get',
parameters: params,
onSuccess: function(req) {
something...
},
onFailure: function() {
something....
}
}
);
XMLHttpRequest를 쉽게 구현해 주는 부분입니다. -> API 보기
url : 접속할 URL입니다. 뒤에 오는 method가 get일 경우 get방식의 prameters를 붙여서 사용할 수 있습니다.
예) var url = "http://test.com/test.xml?id=1234&date=2007-03-01";
method : get/post 가 올 수 있습니다.
parameters : get 방식의 경우 null 이 옵니다. post의 경우는 ?를 제외한 prameter를 붙여서 사용 합니다.
예) var params = "id=1234&date=2007-03-01";
onSuccess : 성공 했을때의 코드를 기술 합니다.
onFailure : 실패 했을때의 코드를 기술 합니다.
printHTML() 은 JSON으로 파싱된 값들을 받아서 뿌려 주는 일을 합니다.
var xml = rssParser(req.responseXML);
로 받아서 printHTML(xml)로 보냈습니다.
channel의 title을 가져 올 때는 단순히 xml.title
item[0]의 title을 가져 올 때는 xml.item[0].title 이렇게 가져 오면 됩니다.
rssParser.js는 다음 post에서 만나 보실 수 있습니다.
[출처] Javascript 를 이용한 초간단 Rss Reader 구현하기 (2) |작성자 루틴
3. XML Parser - rssParser.js
먼저의 post에서 var xml = rssParser(req.responseXML); 를 보셨을 것입니다.
req.responseXML 을 받아서 JSON으로 파싱 하는 것입니다.
이부분은 rssParser.js란 javascript파일로 따로 구현해 보았습니다.
먼저 전체 소스를 보시죠.
0: /** 1: * @(#)rssParser.js V0.1 2007/03/15 2: * 3: * rss XML Parser extend Prototype.js v1.5 4: * Copyright 2005-2007 by VRICKS, All Right Reserved. 5: * http://www.vricks.com 6: * 7: * GNU LESSER GENERAL PUBLIC LICENSE 8: * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 9: * 10: * @Author Woo-Chang Yang, routine@vrick.com 11: */ 12: 13: function rssParser(xml) { 14: var v = Try.these( 15: // Rss ¹öÀüÀ» °¡Á® ¿É´Ï´Ù. 16: function() { 17: return xml.getElementsByTagName("rss")[0].getAttribute("version") ? "2.0" : false; 18: }, 19: function() { 20: return xml.getElementsByTagName("rdf:RDF")[0].getAttribute("xmlns") ? "1.0" : false; 21: }, 22: function() { 23: return xml.getElementsByTagName("feed")[0].getAttribute("xmlns") ? "atom" : false; 24: } 25: ) 26: switch(v) { 27: case "2.0" : return new rssParser2(xml); break; 28: case "1.0" : return new rssParser1(xml); break; 29: case "atom" : return new rssParserAtom(xml); break; 30: default : return false; 31: } 32: }; 33: 34: // Rss 2.0 Calss 35: var rssParser2 = Class.create(); 36: Object.extend(rssParser2.prototype, { 37: initialize : function(xml) { 38: var channel = xml.getElementsByTagName("channel")[0]; 39: this.title = channel.getElementsByTagName("title")[0].firstChild.nodeValue; 40: this.link = channel.getElementsByTagName("link")[0].firstChild.nodeValue; 41: if(channel.getElementsByTagName("image")[0]) { 42: var images = channel.getElementsByTagName("image")[0]; 43: this.image = { 44: "url" : images.getElementsByTagName("url")[0].firstChild.nodeValue, 45: "title" : images.getElementsByTagName("title")[0].firstChild.nodeValue, 46: "link" : images.getElementsByTagName("link")[0].firstChild.nodeValue 47: }; 48: } 49: else { 50: this.image = { 51: "url" : "", 52: "title" : "", 53: "link" : "" 54: } 55: } 56: this.description = Try.these ( 57: function() { 58: return channel.getElementsByTagName("description")[0].firstChild.nodeValue; 59: }, 60: function() { return "" } 61: ); 62: this.language = Try.these ( 63: function() { 64: return channel.getElementsByTagName("language")[0].firstChild.nodeValue; 65: }, 66: function() { 67: return channel.getElementsByTagName("dc:language")[0].firstChild.nodeValue; 68: }, 69: function() { return ""} 70: ); 71: this.pubDate = Try.these( 72: function() { 73: return channel.getElementsByTagName("pubDate")[0].firstChild.nodeValue; 74: }, 75: function() { 76: return channel.getElementsByTagName("lastBuildDate")[0].firstChild.nodeValue; 77: }, 78: function() { return ""; } 79: ); 80: var items = new Array(); 81: $A(channel.getElementsByTagName("item")).each(function(i){ 82: items.push({ 83: "category" : Try.these( 84: function() { 85: return i.getElementsByTagName("category")[0].firstChild.nodeValue; 86: }, 87: function() { return "" } 88: ), 89: "title" : i.getElementsByTagName("title")[0].firstChild.nodeValue, 90: "link" : i.getElementsByTagName("link")[0].firstChild.nodeValue, 91: "description" : Try.these ( 92: function() { 93: return i.getElementsByTagName("description")[0].firstChild.nodeValue; 94: }, 95: function() { return "" } 96: ), 97: "pubDate" : Try.these ( 98: function() { 99: return i.getElementsByTagName("pubDate")[0].firstChild.nodeValue; 100: }, 101: function() { 102: return i.getElementsByTagName("dc:date")[0].firstChild.nodeValue; 103: }, 104: function() { return "" } 105: ) 106: }) 107: }) 108: this.item = items; 109: } 110: }); 111: 112: var rssParser1 = Class.create(); 113: Object.extend(rssParser1.prototype, { 114: initialize : function(xml) { 115: var channel = xml.getElementsByTagName("channel")[0]; 116: var images = xml.getElementsByTagName("image")[0]; 117: this.title = channel.getElementsByTagName("title")[0].firstChild.nodeValue; 118: this.link = channel.getElementsByTagName("link")[0].firstChild.nodeValue; 119: this.image = { 120: "url" : images.getElementsByTagName("url")[0].firstChild.nodeValue, 121: "title" : images.getElementsByTagName("title")[0].firstChild.nodeValue, 122: "link" : images.getElementsByTagName("link")[0].firstChild.nodeValue 123: }; 124: this.description = channel.getElementsByTagName("description")[0].firstChild.nodeValue; 125: this.language = channel.getElementsByTagName("dc:language")[0].firstChild.nodeValue; 126: this.pubDate = channel.getElementsByTagName("dc:date")[0].firstChild.nodeValue; 127: var items = xml.getElementsByTagName("item"); 128: var itemValue = new Array(); 129: for(var i = 0; i < items.length; i++) { 130: itemValue.push({ 131: "category" : items[i].getElementsByTagName("category")[0].firstChild.nodeValue, 132: "title" : items[i].getElementsByTagName("title")[0].firstChild.nodeValue, 133: "link" : items[i].getElementsByTagName("link")[0].firstChild.nodeValue, 134: "description": 135: items[i].getElementsByTagName("description")[0].firstChild.nodeValue, 136: "pubDate" : items[i].getElementsByTagName("dc:date")[0].firstChild.nodeValue 137: }); 138: }; 139: this.item = itemValue; 140: } 141: }); 142: 143: var rssParserAtom = Class.create(); 144: Object.extend(rssParserAtom.prototype, { 145: initialize : function(xml) { 146: this.title = xml.getElementsByTagName("title")[0].firstChild.nodeValue; 147: this.link = xml.getElementsByTagName("link")[0].getAttribute("href"); 148: this.image = { 149: "url" : "", 150: "title" : "", 151: "link" : "" 152: }; 153: this.description = xml.getElementsByTagName("info")[0].firstChild.nodeValue; 154: this.language = ""; 155: this.pubDate = xml.getElementsByTagName("modified")[0].firstChild.nodeValue; 156: var items = xml.getElementsByTagName("entry"); 157: var itemValue = new Array(); 158: for(var i = 0; i < items.length; i++) { 159: itemValue.push({ 160: "category" : "", 161: "title" : items[i].getElementsByTagName("title")[0].firstChild.nodeValue, 162: "link" : items[i].getElementsByTagName("link")[0].getAttribute("href"), 163: "description":items[i].getElementsByTagName("summary")[0].firstChild.nodeValue, 164: "pubDate" : items[i].getElementsByTagName("created")[0].firstChild.nodeValue 165: }); 166: }; 167: this.item = itemValue; 168: } 169: });
function rssParser(xml) {...}을 보시면 Rss의 버전을 구해서 알맞은 Class를 호출 하는 부분 입니다.
Try.these (...) 부분이 보이실 것입니다. API 보기
아래에 나열된 function()을 수행하여 먼저 성공한 하나만을 호출 합니다. 정말 멋진 생각입니다. ^^; var rssParser2 = Class.create();
Object.extend(rssParser2.prototype, { ... }
새로운 Class를 생성하여 prototype을 확장 하였습니다.
Class.create()로 확장을 하면 항상 initialize 를 수행 합니다.
new rssParser2(xml); 하게 되면 자동으로 initialize 부분이 수행이 된다는 의미 입니다.
var channel = xml.getElementsByTagName("channel")[0];
태그명 channel의 첫번째 element를 가져 옵니다. channel이 한개뿐인데 배열로 가져 왔습니다.
태그명으로 가져 올 때는 getElementsByTagName 여기서도 보실수 있듯이 복수형입니다.
그래서 항상 배열형태로 리턴이 됩니다. [0] 이분이 빠지면 에러가 납니다. ^^;이제 channel의 자식 노드들을 뽑아올 차례 입니다.
this.title = channel.getElementsByTagName("title")[0].firstChild.nodeValue;
<channel>아래에 있는 태그명 <title>의 첫번째 노드의 value를 가져 옵니다.
DOM에 대한 자세한 내용은
URL : http://www.ibm.com/developerworks/kr/library/wa-ajaxintro5/ 을 참고 하시기 바랍니다. 이렇게 title, lilnk, descriiption을 가져옵니다.
pubDate의 경우는 먼저 pubDate 태그를 찾은 후 없으면 lastBuildDate를 그것도 없으면 공백문자를 리턴해 줍니다.
뭐 어려운거 없습니다. 그냥 DOM으로 노드 뽑아 오듯이 하나씩 뽑아서 대입해 주면 됩니다.
<item>태그에 들어있는 각각의 post를 가져올 차례입니다.
$A(channel.getElementsByTagName("item")).each(function(i){ ... })
$A는 Array의 확장판으로 Ruby틱한 배열형태를 사용할 수 있도록 해 줍니다. API 보기
<item>을 돌면서 <item>에 포함한 <title>, <link>, <description>, <pubDate>를 가져와서 JSON형태로 파싱하고
파싱된 것들을 item이란 변수에 배열로 담아 놓습니다.
이렇게 해 놓으면 후에 item[i].title, item[i].link, item[i].description 으로 가져올 수 있습니다.
어떻게 글로 설명을 할려니 더 어려워 진거 같네요.
구현된 모습을 한번 보겠습니다.

이것으로 이번 post는 마치겠습니다.
시간이 되면 rssParser.js를 이용한 구글 개인화 페이지를 구현해 보도록 하겠습니다.
물론 prototype.js를 이용할 것이며 Scriptaculous 의 이펙트도 이용할 것입니다.
화면상으로 잠시 맛배기를 ^^;


태초에 나는 개그이야기를 만들었다.
내말을 믿고 나를 따르면 천당,
내말을 믿지않고 나를 따르지 않으면 지옥,
나는 하늘나라(우주)에 사느니라.
그럼 난 외계인?
이슈/로또/정보
