행복기사로고TeamBlog.http://utdae.urin79.com/rss

2009.04.10 15:52:01 (*.186.243.3)
1478

RSS와 AJAX의 간단한 뉴스 리더

RSS와 AJAX: 간단한 뉴스 리더

 

제공: 한빛 네트워크
저자: Paul Sobocinski, 이대엽 역
원문: 
RSS and AJAX: A Simple News Reader 

 

나름대로 개념정의 
XML -> Mark Up language이다.  html과는 달리 스크립트이기 보다 DATABASE의 성격이 강하다. 
Well-formed XML -> XML로써 정의되기위한 기본구성조건 
DTD -> document type definition 의 약자로 문서원형 정의라 할수있다 
XSL -> XML 와 프리젠테이션 문서간 변형 역할 
DOM -> Document Object Model  DOM은 HTML과 XML 문서를 연결시켜주는 프로그래밍적 인터페이스 
SAX -> simple api for xml  웹파일들을 해석할수 있게 해주는 응용프로그램 인터페이스 
XQL ->  저장매체로써 XML 
XML_RSS -> Really Simple Syndication의약자로  xml를 이용한 콘텐츠 정보를 교환 목적으로 된 규약 
XML_RPC -> remote procedure call 의 약자로  다른언어로 작성된 프고르램이 스로세스를 공유하면서 수행되도록 구성된것 
SOAP -> Simple Object Access Protocol  xml 이용 통신규약? 
WSDL -> 웹서비스에서 제공하는 것들에 대한 정보 및 기타 등등 이 있는 문서 
AJAX -> XMLHttpRequest 객체를 이용한 자바스크립트 class 
XMLHttpRequest -> 브라우저가 웹서버와 통신하기 위한 컴포넌트. 
MSXML.DOMDocument -> MS에서 제공하는 DOM 객체 컴포넌트. 


개념잡기 참조 사이트 
XML의 구조와 문법 
http://blog.naver.com/pciswife?Redirect=Log&logNo=100020781686 
Well-formed XML 
http://blog.naver.com/swinter8?Redirect=Log&logNo=130000715517 
RSS 란 
http://blog.empas.com/apple8856/list.html?p=2 
XML DOM 초보자를 위한 가이드 
http://blog.naver.com/BlogMain.nhn?blogId=ncs74&Redirect=Dlog&Qs=/ncs74/90000341312 
간단한 RSS 리더 구현 (ASP) 
http://blog.naver.com/harkbart?Redirect=Log&logNo=20329936 
SOAP의 Attachment 기능을 이용한 이기종간 파일 전송-5 
http://blog.naver.com/harry5313?Redirect=Log&logNo=50000779862 
ASP 와 XML 
http://blog.naver.com/multist?Redirect=Log&logNo=7761684 
XMLHttpRequest 기본문법 
http://blog.naver.com/nhsbs?Redirect=Log&logNo=130001581285 
SOAP Format 
http://cafe.naver.com/infonuri.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=7 
XMLHTTP 예제 
http://jibbering.com/2002/4/httprequest.html 
XMLHttpRequest 
http://kb.mozillazine.org/XMLHttpRequest 
MSDN XML 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmsxml/html/msxmlcabfile.asp 
IBM XML 
http://www-128.ibm.com/developerworks/kr/xml/ 매우도움됨 
객체 reference 
http://www.xulplanet.com/references/xpcomref/ifaces/nsIXMLHttpRequest.html 
AJAX 프로그래밍 with .NET 
http://blog.naver.com/ez4ez?Redirect=Log&logNo=20292120 




 




Ajax RSS 파서 


Ajax(Asynchronous JavaScript And XML)와 RSS(Really Simple Syndication)는 웹을 매료시키는 두 가지 기술이다. 일반적으로 RSS는 사람 혹은 조직에 뉴스를 제공하기 위하여 사용된다. 이것은 웹 사이트로부터 "RSS 피드(feed)"를 공급받음으로써 이루어진다. RSS 피드는 단순히 특정한 방식으로 구조화되어 있는 XML 파일에 대한 링크일 뿐이다. RSS 스펙에는 XML 파일로 기대되는 구조로 나타나 있다. 예를 들어, 스펙에는 제목, 저자, 그리고 설명 태그를 필요로 하는데, 따라서 모든 RSS XML 파일은 최소한 이 3가지 태그를 가지게 된다. 

여기에서 사용하게 될 RSS 스펙의 버전은 2.0인데, 가장 최신이며 3가지 RSS 스펙(0.98, 1.0, 2.0) 중 가장 널리 사용되고 있는 것이다. 다행히도, RSS 2.0은 RSS 1.0에 비해 훨씬 덜 복잡하므로 여러분은 아래에 링크되어 있는 RSS 2.0 스펙에 금방 익숙해질 것이다: 
blogs.law.harvard.edu/tech/rss. 만약 여러분이 RSS에 대한 포괄적인 소개를 원한다면 3가지 RSS 스펙을 모두 다루고 있는 아래 링크를 방문해 보라:www.xml.com/pub/a/2002/12/18/dive-into-xml.html 

왜 RSS를 파싱하기 위해 Ajax를 사용할까? Ajax를 사용함으로써 웹 브라우저로 전달되는 RSS XML 파일을 처리하는 작업을 생략할 수 있는데, 따라서 서버의 부하를 줄일 수 있다. 또한 Ajax는 사용자로 하여금 좀 더 끊김 없는 웹 경험을 가질 수 있게끔 해주는데, 이는 서버로부터 전달받는 전체 RSS XML 파일을 페이지를 갱신하지 않고도 가져 올 수 있기 때문이다. 마지막으로 Ajax는 XML 파일을 처리할 수 있도록 설계되어 있으므로 RSS를 간단하고 우아한 방법으로 파싱할 수 있다. 

이 기사 때문에 여러분이 Ajax에 익숙해질 필요는 없다. 하지만 기본적인 자바스크립트에 대한 이해는 강력히 권장한다. 

아래에 파서가 어떻게 작동할 것인지에 대해 나와있다. 먼저 RSS 피드 파일명이 HTML form에서 선택된다. 사용자가 전송 버튼을 클릭하면 getRSS() 함수가 호출된다. 이 함수는 지정된 RSS XML 파일을 서버로부터 읽어오는 역할을 한다. 한번 서버로부터 읽어오는 것이 성공하면, processRSS() 함수가 전달받은 XML 파일을 자바스크립트 객체로 변환한다. 마지막으로 showRSS(RSS) 함수가 호출되는데, 이 함수는 RSS 자바스크립트 객체에 저장되어 있는 몇 가지 정보를 HTML 페이지를 갱신함으로써 보여준다. 아래의 도식은 이러한 일련의 단계들을 요약한 것이다. 

그림1
그림 1. 전체적인 설계 

HTML 파일 


먼저 HTML 파일을 살펴볼 것이다. 위쪽의 폼 엘리먼트에 작성된 코드는 어느 RSS 피드를 읽어올 것인지를 결정하고, 아래쪽의 루트 div 엘리먼트에 작성된 코드는 RSS 자바스크립트 객체에 저장되어 있는 정보를 보여주기 위해 사용된다.

<html>
<head>
    <!--B-->
    <script language="javascript" src="rssajax6.js"></script>
    <!--C-->
    <style type="text/css">
        #chan_items { margin: 20px; }
        #chan_items #item { margin-bottom: 10px; }
        #chan_items #item #item_title { font-weight: bold; }
    </style>
</head>
<body>
    <!--A-->
    <form name="rssform" onsubmit="getRSS(); return false;">
        <select name="rssurl">
            <option value="test-rss.xml">test RSS feed</option>
            <option value="google-rss.xml">google RSS feed</option>
        </select>
        <input type="submit" value="fetch rss feed" />
    </form>

    <div id="chan">
        <div id="chan_title"></div>
        <div id="chan_link"></div>
        <div id="chan_description"></div>
        <a id="chan_image_link" href=""></a>
        <div id="chan_items"></div>
        <div id="chan_pubDate"></div>
        <div id="chan_copyright"></div>
    </div>
</body>
</html>
이제 나머지 대부분의 HTML 코드는 무시하기로 하고 <!-A-->로 표시되어 있는 폼 엘리먼트에 집중하기로 하자. RSS XML 파일의 이름은 select 엘리먼트의 option 태그의 value 속성으로 지정되어 있다. 사용자가 이러한 파일 가운데 하나를 선택하고 나면 폼이 전송된다. 전체 과정을 시작시키는 자바스크립트가 onsubmit 태그에 있는 것을 볼 수 있다. 자바스크립트 함수가 호출된 다음 폼 전체가 서버로 "틀에 박힌" 방식대로 전달되는 것을 막기 위해 false를 리턴하도록 return false 문장을 추가하였다. 만약 return false 문장을 생략했다면 전체 페이지가 갱신되면서 Ajax를 이용하여 읽어왔던 모든 데이터를 잃어버리게 될 것이다. 마지막으로 남은 하나는 <!-B-->로 표시된 부분에서 분리되어 있는 파일을 참조하도록 자바스크립트 코드가 헤더 부분에 포함되어 있다는 것이다. 여러분이 의아해 할 경우를 대비해서 설명하는 것이지만 <!-C-->로 표시된 부분에서 <style> 태그의 내용은 브라우저에게 showRSS(RSS) 함수에 의해 RSS 데이터가 HTML 페이지에 쓰여졌을 때 어떻게 보여주어야 하는지를 나타내는 것이다. 

서버로부터 XML 읽어오기 : getRSS() 함수 


아래에 getRSS() 함수가 나타나 있다:
function getRSS()
{
    /*A*/
    if (window.ActiveXObject) //IE
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    else if (window.XMLHttpRequest) //other
        xhr = new XMLHttpRequest();
    else
        alert("your browser does not support AJAX");

    /*B*/
    xhr.open("GET",document.rssform.rssurl.value,true);

    /*C*/
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.setRequestHeader("Pragma", "no-cache");

    /*D*/
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4)
        {
            if (xhr.status == 200)
            {
                /*F*/
                if (xhr.responseText != null)
                    processRSS(xhr.responseXML);
                else
                {
                    alert("Failed to receive RSS file from the server - file not found.");
                    return false;
                }
            }
            else
                alert("Error code " + xhr.status + " received: " + xhr.statusText);
        }
    }

    /*E*/
    xhr.send(null);
}
이 함수를 단계별로 훑어보면서 그것이 무엇을 하는지 생각해 보자. 코드내에 포함되어 있는 레이블은 아래의 대응되는 설명을 가리킨다. 

A: 서버와 통신하기 위하여 먼저 XMLHttpRequest(XHR) 객체를 정의해야 한다. 이 객체는 브라우저를 갱신하지 않고도 서버에 접속하도록 해주는 것이며 이는 모든 Ajax 애플리케이션의 핵심이다. 기대하는 바과 같이 인터넷 익스플로러는 XHR 객체를 파이어폭스나 사파리와 같은 다른 브라우저와는 다르게 정의한다. 여기에서는 어느 브라우저에서 자바스크립트가 실행되고 있는지 결정하기 위해 객체 감지(object detection) 기법을 사용하였으므로 따라서 XHR 객체를 적절하게 정의하게 된다. 

B: 이 코드는 xhr.open() 함수를 호출함으로써 XHR 객체를 초기화 하는 것이다. 이 함수는 3개의 인자를 가지는데, 첫번째는 서버로부터 파일을 읽어오는 데 사용할 메소드, 두번째는 읽어올 파일의 이름, 그리고 세번째는 응답을 비동기적으로 받고 싶다면 true로 설정한다. 여기에서는 서버로 아무런 데이터도 보내지 않을 것이므로 GET 요청으로도 충분하다. RSS XML 파일의 이름은 HTML 폼으로부터 직접 가져오게 된다. 마지막으로 비동기 응답으로 지정함으로써 파일 수신에 대해 "대기"할 필요가 없어진다. 사실 수신이 완료되었을 때 호출되는 함수를 정의함으로써 언제 사용가능한지를 알 수도 있다(이것은 차후에 좀 더 설명할 것이다). 

C: 서버로부터 갱신된(캐싱되지 않은) 요청을 하는 것이 중요한데, 여기에서 그렇게 되도록 보장하기 위해 요청 헤더를 설정하였다(Pragma는 하위 호환성을 위해 포함시켰다). 

D: 서버와의 연결을 비동기적으로 수행하게끔 지정하였기 때문에 XHR 객체는 서버의 응답이 사용가능하게 될 때 어떤 함수가 호출될지 알아야 할 필요가 있다. 이것은 XHR 객체의 onreadystatechange 속성에 사용하고자 하는 것인데, XHR 객체의 readyState 속성이 변경되었을 때 실행시키고자 하는 함수와 동일한 것으로 설정한다. 목적을 달성하기 위해서 readyState의 값이 4인지만을 신경쓰면 되는데, 왜냐하면 이것이 응답이 사용가능함을 의미하기 때문이다. xhr.status의 값이 200이면 성공적인 응답을 받았음을 의미하며 다른 모든 상태 코드는 적절한 응답을 받지 않았음을 의미한다. 

E: 이미 위에서 서버로부터 응답을 받기 위하여 XHR 객체를 초기화 하였다. 이제 여기에서 서버의 요청/응답 과정을 수행하기 위해 xhr.send() 함수를 호출한다. 전송할 데이터가 아무것도 없으므로 인자로서 null을 전달한다. 

F: 여기까지 도달했다면 서버로부터의 응답을 성공적으로 수신했으며 XML 파일을 처리할 준비가 된 것이다. 마지막으로 단지 비어있는 응답을 받지는 않았는지 확인만 하면 된다. responseText 속성을 검사함으로써 확인 절차를 수행할 수 있으며(responseText는 텍스트 형태로 수신된 파일을 저장하고 있다) 이제 processRSS() 함수를 호출할 준비가 되었다. 

XML 파싱하기: processRSS() 함수와 RSS2Channel 객체 


아래에 processRSS() 함수가 나타나 있다.
function processRSS(rssxml)
{
    RSS = new RSS2Channel(rssxml);
    showRSS(RSS);
}
이 함수는 단순히 RSS2Channel 객체의 생성자를 호출하고 rssxml을 전달한다. 이 인자는 특별한 의미를 지니고 있는데, 그것은 모든 RSS 정보를 포함한다는 것이다. 게다가 자바스크립트는 이것을 XML 객체로서 인식할 수 있으며, 따라서 자바스크립트에 내장된 DOM(문서 객체 모델; Document Object Model)의 함수와 속성을 그것에 사용할 수 있다. 이는 서버의 응답을 받기 위하여 XHR 객체의 속성인 responseXML을 사용하였으므로 이러한 작업이 가능하다. 만약 responseText를 사용하였다면 XML을 파싱하는 것은 훨씬 더 어려워질지도 모른다.. 

이제 RSS2Channel 객체를 검토할 것이다. 각각의 RSS XML 파일은 항상 정확히 하나의 채널(channel) 엘리먼트를 포함하고 있는데, 이 엘리먼트는 모든 RSS 데이터를 포함하고 있다. 여러분이 기대하고 있는 바와 같이, 이 데이터는 몇 개의 하위 혹은 자식 엘리먼트로 구성되어 있다. 따라서 채널은 RSS XML 파일의 루트 엘리먼트이며 이것은 RSS2Channel 객체에 의해 표현된다. 이 객체가 아래에 나타나 있다.
function RSS2Channel(rssxml)
{
    /*A*/
    /*required string properties*/
    this.title;
    this.link;
    this.description;

    /*optional string properties*/
    this.language;
    this.copyright;
    this.managingEditor;
    this.webMaster;
    this.pubDate;
    this.lastBuildDate;
    this.generator;
    this.docs;
    this.ttl;
    this.rating;

    /*optional object properties*/
    this.category;
    this.image;

    /*array of RSS2Item objects*/
    this.items = new Array();

    /*B*/
    var chanElement = rssxml.getElementsByTagName("channel")[0];
    var itemElements = rssxml.getElementsByTagName("item");

    /*C*/
    for (var i=0; i<itemElements.length; i++)
    {
        Item = new RSS2Item(itemElements[i]);
        this.items.push(Item);
    }

    /*D*/
    var properties = new Array("title", "link", "description", 
          "language", "copyright", "managingEditor", "webMaster", 
          "pubDate", "lastBuildDate", "generator", "docs", "ttl", "rating");
    var tmpElement = null;
    for (var i=0; i<properties.length; i++)
    {
        tmpElement = chanElement.getElementsByTagName(properties[i])[0];
        if (tmpElement!= null)
            eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue");
    }

    /*E*/
    this.category = new RSS2Category(chanElement.getElementsByTagName("category")[0]);
    this.image = new RSS2Image(chanElement.getElementsByTagName("image")[0]);
}
시작하기에 앞서 코드들을 좀 더 작은 조각으로 쪼갠 다음 각각의 것들을 하나씩 설명할 것이다. 

A: 안내하자면 이것은 값을 할당하고자 하는 모든 속성의 목록을 나열한 것이다. 이러한 각각의 속성들은 RSS XML 엘리먼트에 대응된다. 예를 들어, this.language 속성을 <language>en-us</language> XML 태그안에 있는 문자열, 이 경우에는 en-us과 동일하게 설정할 것이다. 몇 가지 다른 속성들은 RSS2Channel과 같은 사용자 정의 객체가 될 것이다. 이것은 곧 좀더 자세하게 설명할 것이다. 

B: 여기에서는 두 개의 변수를 생성하였는데 하나는 channel 엘리먼트의 내용을 저장하기 위한 것이고, 다른 하나는 item 엘리먼트의 배열을 저장하기 위한 것이다. 이를 위하여 getElementsByTagName() 함수를 사용하였는데, 이 함수는 XML 파일내의 지정된 태그명과 일치하는 모든 엘리먼트의 배열을 리턴한다. 앞서 언급했던 것과 같이 RSS XML 파일은 오직 한 개의 channel 태그를 포함하고 있기 때문에 한 개의 엘리먼트만을 가진 배열을 리턴할 것으로 예상할 수 있다. 따라서 객체를 전달받기 위해 함수 호출부의 끝에 [0]을 추가하여 그것을 chanElement에 할당하였다. 반면, itemElements는 배열이어야 할 필요가 있는데 왜냐하면 RSS XML 파일은 다수의 <item> 태그를 가질 것이기 때문이다. 

C: 이 루프는 itemElements 배열을 순회하며 각각의 item 엘리먼트에 대해 파싱을 수행한다. RSS XML 파일내의 <item> 태그는 여러 개의 자식 태그를 포함하고 있으므로 의미있는 방법으로 이러한 데이터들을 저장할 RSS2Item 객체를 만들 필요가 있다. 코드에서는 현재 item 엘리먼트를 생성자에 전달하여 생성된 객체를 Item에 할당한다. 이 루프의 수행이 완료되면 RSS2Channel 객체의 items 속성들은 사용자 정의 RSS2Item 객체들의 배열을 포함할 것이다. RSS2Channel에 대한 작업이 완료되면 RSS2Item 객체에 대해 계속 논의할 것이다. 

eval() 함수의 사용 


계속 이어가기 전에 여러분이 eval() 함수에 익숙하지 않을 경우에 대비해서 eval() 함수에 대해 간략히 설명하고자 한다. 이 함수는 하나의 인자를 가지는데 이 인자는 여러분이 실행시키고자 하는 프로그램의 자바스크립트 코드를 포함하는 문자열이다. 예를 들어 eval('return true')는 return true와 동일하다. 앞으로 계속 보겠지만 이 함수는 수많은 속성을 가진 객체를 처리할 때 유용하다. 

D: 이제 속성 값으로 단순 문자열을 가지는 객체의 모든 속성들을 설정해볼 것이다. 이러한 모든 속성들이 chanElement 객체에서 동일한 방식으로 가져오기 때문에 설정하고자 하는 모든 속성의 이름을 가진 배열을 하나 정의한 다음 for 루프를 이용하여 배열을 순회한다. 여기에서는 시험하고 있는 XML 태그의 실질적인 문자열 값을 가져오기 위해 childNodes와 nodeValue라는 두 개의 속성에 접근할 것이다. 첫 번째 속성인 childNodes는 객체 배열의 폼 안에 있는 모든 자식 XML 엘리먼트를 노출시켜 주며, 두 번째 속성은 XML 엘리먼트의 실질적인 문자열 값을 얻는다. 여기에서 가져오고 있는 속성의 경우 그것들이 아무런 자식 XML 태그를 가지고 있지 않기 때문에 childNodes에 의해서 오직 하나의 엘리먼트만이 리턴된다. 그리고 나서 nodeValue는 childNodes[0]안에 있는 엘리먼트의 값을 가져오게 된다. 

E: 마지막으로 this.category와 this.image 속성을 지정한다. D에서 논의했던 속성과는 달리 여기에서는 자식 태그를 갖고 있으므로 이러한 XML 엘리먼트(RSS2Category와 RSS2Image 각각)를 처리하기 위해 사용자 정의 객체를 생성해야 한다. 이제 RSS2Category 함수를 살펴보기로 하자:
function RSS2Category(catElement)
{
    if (catElement == null) {
        this.domain = null;
        this.value = null;
    } else {
        this.domain = catElement.getAttribute("domain");
        this.value = catElement.childNodes[0].nodeValue;
    }
}
이 객체는 두 개의 속성(domain과 value)을 가진 단순한 객체이다. value 속성은 XML 태그의 실질적인 내용을 포함하는데 반해, domain 속성은 XML domain 태그 속성의 내용이 설정된다. 예를 들어, 일반적인 category XML 엘리먼트의 모습은 다음과 같다: <category domain="Syndic8">1785</category>. 이 경우 this.domain의 값은 Syndic8이 되며 this.value의 값은 1785가 된다. XML 태그로부터 domain 속성을 구하기 위해 getAttribute() 함수를 이용하여 파라미터로서(이 경우, domain) 읽어오기를 원하는 태그의 속성을 전달한다. 

RSS XML 파일내의 image 태그는 오직 속성만을 포함하고 있으므로 RSS2Image 생성자는 getAttribute() 함수를 확장시켜 사용한다.
function RSS2Image(imgElement)
{
    if (imgElement == null) {
    this.url = null;
    this.link = null;
    this.width = null;
    this.height = null;
    this.description = null;
    } else {
        imgAttribs = new Array("url","title","link","width","height","description");
        for (var i=0; i<imgAttribs.length; i++)
            if (imgElement.getAttribute(imgAttribs[i]) != null)
                eval("this."+imgAttribs[i]+"=imgElement.getAttribute("+imgAttribs[i]+")");
    }
}
이제 RSS2Channel 객체에 남아있는 마지막 속성인 items에 대해 알아볼 것인데, items는 RSS2Item 객체들의 배열을 포함하고 있다. 이 객체의 코드가 아래에 나타나 있다:
function RSS2Item(itemxml)
{
    /*A*/
    /*required properties (strings)*/
    this.title;
    this.link;
    this.description;

    /*optional properties (strings)*/
    this.author;
    this.comments;
    this.pubDate;

    /*optional properties (objects)*/
    this.category;
    this.enclosure;
    this.guid;
    this.source;

    /*B*/
    var properties = new Array("title", "link", "description", "author", "comments", "pubDate");
    var tmpElement = null;
    for (var i=0; i<properties.length; i++)
    {
        tmpElement = itemxml.getElementsByTagName(properties[i])[0];
        if (tmpElement != null)
            eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue");
    }

    /*C*/
    this.category = new RSS2Category(itemxml.getElementsByTagName("category")[0]);
    this.enclosure = new RSS2Enclosure(itemxml.getElementsByTagName("enclosure")[0]);
    this.guid = new RSS2Guid(itemxml.getElementsByTagName("guid")[0]);
    this.source = new RSS2Source(itemxml.getElementsByTagName("source")[0]);
}
RSS2Item 객체는 RSS2Channel과 여러모로 비슷하다. 먼저 얻어오게 될 속성을 나열하는 것으로부터 시작한다(A). 그런 다음 문자열 속성들을 순환하여 관련된 XML 태그의 내용을 각각 할당한다(B). 마지막으로 적절한 사용자 정의 객체의 생성자를 호출하여 객체의 속성을 설정하는데, 각 경우에 대응되는 데이터를 포함하고 있는 XML 엘리먼트를 전달한다. 

RSS2Item 객체에서 찾아볼 수 있는 사용자 정의 객체들이 아래에 나열되어 있다. 그것들은 RSS2Category와 RSS2Image 객체와 비슷하며 앞에서 논의되었던 함수나 속성들을 아무것도 사용하지 않는다.
function RSS2Enclosure(encElement)
{
    if (encElement == null) {
        this.url = null;
        this.length = null;
        this.type = null;
    } else {
        this.url = encElement.getAttribute("url");
        this.length = encElement.getAttribute("length");
        this.type = encElement.getAttribute("type");
    }
}

function RSS2Guid(guidElement)
{
    if (guidElement == null) {
        this.isPermaLink = null;
        this.value = null;
    } else {
        this.isPermaLink = guidElement.getAttribute("isPermaLink");
        this.value = guidElement.childNodes[0].nodeValue;
    }
}

function RSS2Source(souElement)
{
    if (souElement == null) {
        this.url = null;
        this.value = null;
    } else {
        this.url = souElement.getAttribute("url");
        this.value = souElement.childNodes[0].nodeValue;
    }
}
이제 RSS 객체를 완전하게 정의하였으므로 마지막 과정으로 옮겨갈 수 있는데, 마지막 과정은 객체의 실제 내용을 보여주는 것이다. 

RSS 데이터 보여주기: showRSS(RSS) 함수 


showRSS(RSS) 함수의 자바스크립트 코드를 살펴보기 전에 앞에서 언급되었던 HTML 페이지의 루트 div 엘리먼트를 살펴보기로 하자.
    <div class="rss" id="chan">
        <div class="rss" id="chan_title"></div>
        <div class="rss" id="chan_link"></div>
        <div class="rss" id="chan_description"></div>
        <a class="rss" id="chan_image_link" href=""></a>
        <div class="rss" id="chan_items"></div>
        <div class="rss" id="chan_pubDate"></div>
        <div class="rss" id="chan_copyright"></div>
    </div>
코드에서 볼 수 있듯이, 루트 div 엘리먼트는 여러 개의 자식 div 태그들을 가지고 있다. 이 태그들은 아래에 나타나 있는 showRSS(RSS) 함수에 의해 RSS 객체안의 데이터들을 보여줄 것이다.
function showRSS(RSS)
{
    /*A*/
    var imageTag = "<img id='chan_image'";
    var startItemTag = "<div id='item'>";
    var startTitle = "<div id='item_title'>";
    var startLink = "<div id='item_link'>";
    var startDescription = "<div id='item_description'>";
    var endTag = "</div>";

    /*B*/
    var properties = new Array("title","link","description","pubDate","copyright");
    for (var i=0; i<properties.length; i++)
    {
        eval("document.getElementById('chan_"+properties[i]+"').innerHTML = ''"); /*B1*/
        curProp = eval("RSS."+properties[i]);
        if (curProp != null)
            eval("document.getElementById('chan_"+properties[i]+"').innerHTML = curProp"); /*B2*/
    }

    /*C*/
    /*show the image*/
    document.getElementById("chan_image_link").innerHTML = "";
    if (RSS.image.src != null)
    {
        document.getElementById("chan_image_link").href = RSS.image.link; /*C1*/
        document.getElementById("chan_image_link").innerHTML = imageTag
            +" alt='"+RSS.image.description
            +"' width='"+RSS.image.width
            +"' height='"+RSS.image.height
            +"' src='"+RSS.image.url
            +"' "+"/>"; /*C2*/
    }


    /*D*/
    document.getElementById("chan_items").innerHTML = "";
    for (var i=0; i<RSS.items.length; i++)
    {
        item_html = startItemTag;
        item_html += (RSS.items[i].title == null) ? "" :
                  startTitle + RSS.items[i].title + endTag;
        item_html += (RSS.items[i].link == null) ? "" :
                  startLink + RSS.items[i].link + endTag;
        item_html += (RSS.items[i].description == null) ? "" :
                  startDescription + RSS.items[i].description + endTag;
        item_html += endTag;
        document.getElementById("chan_items").innerHTML += item_html; /*D1*/
    }

    return true;
}
A: RSS 피드안의 channel 항목의 개수를 알 길이 없으므로 그러한 RSS 항목을 위해 동적으로 HTML을 생성해야 한다. 이것들은 RSS2Item 데이터를 포함하게 될 HTML 태그의 기본값들이다. 또한 호환성을 위해 img HTML태그를 동적으로 생성할 것이다. 

B: 여기에서는 RSS2Category 객체안의 문자열 속성들을 순회하는데, 이것은 생성자 내에서 했던 것과 유사하다. 기존의 RSS 피드로부터 남아있을지도 모를 데이터를 제거하기 위하여 B1 라인에 있는 innerHTML 속성을 초기화한다. getElementById() 함수를 호출하여 HTML로부터 필요한 구체적인 div 엘리먼트들을 읽어올 수 있는데, 그러한 속성을 제공하는 것이 정의되어 있으므로 B2 라인에 있는 div 엘리먼트에 새로운 값을 설정한다. 

C: 다시 한번 RSS 피드로부터 이미지를 포함하게 될 HTML 엘리먼트를 가져오기 위하여 getElementById() 함수를 사용한다. 이미지를 링크시켜야 하므로 div 엘리먼트 대신 앵커 엘리먼트(a)를 사용한다. 앵커 엘리먼트의 href 속성은 어떤 이미지가 링크되어야 하는지를 지정하므로 그 값을 RSS.image.link (C1)의 값으로 할당한다. 엘리먼트의 내용은 B 파트(C2)에서 했던 것과 같이 innerHTML 속성을 이용하여 채워진다. 

D: 여기에서는 RSS 객체내의 항목들을 보여주는 부분이다. 제목, 링크, 설명을 포함하는 각각의 RSS 항목에 대한 div 태그가 정의되어 있다. 이해를 돕기 위하여 다른 속성들은 생략하였다. 각각의 div 태그는 innerHTML 속성 (D1)을 이용하여 chan_items의 부모 태그의 내용에 추가된다. 

요약 


Ajax RSS 파서는 윈도 XP상에서 인터넷 익스플로러 6.0과 파이어폭스 1.5.0.6로 테스트하였다. RSS2Channel 객체는 RSS 2.0 스펙의 모든 요소들을 지원하지는 않는다. 생략된 것들에는 cloud, textInput, skipHours, 그리고 skipDays가 있다. 대부분 이러한 RSS 엘리먼트들은 서버측에서만 유용할 뿐이므로 클라이언트측 파서에 포함되는 것은 이치에 맞지 않을지도 모른다. 

코드를 한 줄씩 모두 알아본 뒤에 여러분은 동일한 기능들이 반절 정도의 코드만 가지고도 달성할 수 있을 것이라고 생각할지도 모른다. 특히, XML 엘리먼트로부터 직접 RSS 속성을 읽어내는 방식으로 showRSS(RSS) 함수를 작성함으로써 RSS 객체를 완전히 생략할 수 있었다. 확실이 이것은 가능하다. 하지만, showRSS() 함수는 RSS2Channel 객체가 이용될 수 있는 하나의 예제에 불과함을 의미하는 것 뿐이다. 의미있는 RSS 데이터를 포함하는 RSS 객체를 선언함으로써 훨씬 더 확장가능한 응용 프로그램을 작성할 수 있다. 예를 들어, 코드는 다수의 피드를 읽어낼 수 있도록 쉽게 확장될 수 있다. 이러한 피드들로부터 만들어진 RSS 객체는 조작될 수 있거나 혹은 다른 피드와 비교될 수 있다(여러분은 일정한 간격을 두고 새로운 피드를 읽어올 수 있으며, 그리고 그것을 이전의 것과 비교해볼 수 있다). RSS 객체를 분리한다는 것의 중요한 점은 이러한 증가하는 복잡성을 가진 응용 프로그램의 개발을 더 용이하게 해준다는 것이다. 

지금까지 논의했던 모든 파일들은 아래에서 다운로드 가능하다.

출처 : 한빛미디어





 

제목이 왜? 저런대여? 글 만드는거는 전혀 그렇습니다. 제가 말도 잘 조리있게
못해서 직접 누굴 만나서 대화하면 당신이 무슨 그런걸 할줄 아냐? 오해를 불러오기
딱좋은 글 솜씨와 말 주변 입니다. 실제로 저와 아주 가까운 사람이 눈꼽만큼
아는걸 수레바퀴 만큼 아는척 한다고 해서 그냥 속으로 당신이 믿던 말던 개의치
않고 그랬더랬습니다. 매일 공부를 게을리 하지않는다 이 생각은 숨넘어 가는날
까지 라는 제 사고는 고쳐지지 않는 순악질 ㅋㅋ 두뇌입니다. 아래에 RSS News Ticker
만드는 방법 입니다. 혹시 RSS Feed에 엠파스 블로그 공지글을 샘플로 붙여 봤는데,
혹시 이글이 블로그 운영에 적법치 안으면 이글을 삭제해 주셔도 좋습니다. 블로그
운영자님이 저의 게시판에 iframe 사용을 부여해 ㅋㅋ 주시면 참 좋을듯 한데 바로
보여 드리지 못하고 링크를 거는수 밖에 없군요.. 그럼 본문 입니다. //
AJAX 뉴스티커 만들기.
개인 컴퓨터에서 RSS feed용 프로그램 다운받아 보는 그런것이
아니고 제가 올려 드리는건 웹 사이트 운영하시는 분이 자신의
사이트에 만들어 붙여서 보는 RSS feed 입니다. 참고로 저는
엠파스 블로그 운영자님의 새로운 글을 붙여봤구요.. 그리고
kbs 한국방송 공사 에서 RSS 뉴스 서비스를 하는데, 여기 뉴스를
리더로 읽어 들여보니 흥미롭습니다. RSS리더 프로그램으로 영업을
한다거나 하면 저의 글이 무색해 질겁니다. 비영리를 목적으로
순수히 공부와 개인 사이트의 발전을 위함이면 좋겠습니다. 그리고
저의 여기 블로그 RSS를 붙였습니다. 만드는법은 제가 일이 많아
간략히 올려 드립니다. 따로 첨부파일 안붙혀 드리는건 가만히 그냥
만들어 준거 다운 받기보다 직접 해보셔야 실력이 늘겁니다. 저의
포샵 수준이 바닥이라 이해를 하시고 봐주세요 ^^

1. Ajax 뉴스 티커를 만들려면 우선 아래 링크에서
필요한 자스와 로딩 이미지를 다운 받습니다.
다운이라기 보다 복사해 오시면 되겠죠. 그리고 이걸 동작 시키기
위해서는 구글 API 키를 만듭니다. 아래에서..

2.구글 API 키를 우선 만듭니다. 아래 링크에서

3. 1번항에서 만든 자스 혹은 html 페이지를 열어보시면 news feed 그리고
우측에 뉴스 로딩 페이지 xml주소가 여러분이 넣고싶은 주소를 넣으시면
동작이 멋지게 될겁니다. 제가 요즘 시간이 너무 나지않아 자세하게
설명을 못하여 드립니다. 오늘도 좋은하루 되세요 ^^



 







  • 배경, 글자, 이미지, 인용문등에서 더블클릭을 하시면 상세한 컴포넌트 설정이 가능합니다.
  • 문단 나누기를 하시려면 Ctrl+Enter를 누르시면 됩니다. (글 작성완료 후 Alt+S를 누르면 저장이 됩니다.)
  • 단축키 안내
    • 되돌리기 : Ctrl+Z
    • 다시 실행 : Ctrl+Y
    • 진하게 : Ctrl+B
    • 밑줄 : Ctrl+U
    • 기울임 : Ctrl+I
    • 글맵시 지우기 : Ctrl+D
    • 링크 : Ctrl+L
문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
번호
제목
글쓴이
16 AJAX란 AJAX에 대해서 AJAX소개 AJAX실전
스킬왕
2009-04-10 1435
RSS와 AJAX의 간단한 뉴스 리더 image
구퍼
2009-04-10 1478
14 [NOL] NAVER OpenAPI Library for PHP v0.1
구글러브
2009-04-10 1443
13 네이버 OPENAPI 소스 해석
도파돌이
2009-04-10 1253
12 네이버 OpenAPI를 이용한 실시간 검색 보여주기 image
도파돌이
2009-04-10 1443
11 네이버 openAPI를 이용한 지식인 검색 image
도파돌이
2009-04-10 811
10 네이버 OPENAPI 사용하여 책검색하기 image
글로벌해커
2009-04-10 718
9 네이버다음 실시간 검색어 내 블로그에 붙이기 442 updateimage
구글러브
2009-04-10 1891
8 네이버 API를 이용하여 웹문서및 이미지등의 검색 4 imagemovie
노란자전거
2009-04-10 738
7 [AJAX 프로그래밍] XMLHttpRequest란? 1
구글러브
2009-04-10 1231
6 Using the XML HTTP Request object
포토올
2009-04-10 1005
5 다음 블로그 글쓰기/수정/삭제 (Daum Blog Open API) 설명서 image
포토올
2009-04-10 1022
4 네이버 :: 내PC검색 - OpenAPI 테스트
포토올
2009-04-10 672
3 AJAX RSS Reader
포토올
2009-04-10 635
2 Naver OpenAPI - 실시간 검색어 순위 갱신 방법
포토올
2009-04-10 882
1 RSS없는 웹 페이지에 RSS 만들기 movie
성장통
2009-04-10 742