實現讀取RSS 2.0的Javascript類

來源:互聯網
上載者:User
javascript|rss

這幾天在學習一些Javascript的東西,新入手,很差,只好自己寫一些小例子練手。嗯,放在這裡做備份吧。

這是一個能夠用於讀取RSS 2.0資訊,並把讀到的東西變成Javascript對象的類。和網上能搜到的代碼相比,我這個非常的粗糙,封裝的也不一定合理,反正作為練習嘛,達到目的就成

首先當然是要搞清楚RSS 2.0的結構,它最基本的骨架如下:


<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title></title>
    <link></link>
    <description></description>
    <item>
      <author></author>
      <title></title>
      <description></description>
      <link></link>
      <pubDate></pubDate>
    </item>
  </channel>
</rss>


嗯,這並不是最標準的RSS,而是最簡單的RSS。實際的RSS標準可以看http://blogs.law.harvard.edu/tech/rss,還是很複雜的!

然後,為了方便讀取RSS的XML中每一個結點的內容,做了一個直接從XML轉成Javascript對象的函數,嗯,這個函數可以直接根據Javascript對象的結構來擷取資料哦,也就是類似於ORM的東西啦。


function getXmlData(xml, obj) {
  for (o in obj) {
    if ("object" == typeof(obj[o])) {
      getXmlData(xml.getElementsByTagName(o), obj[o]);
    } else {
      obj[o] = getXmlNodeText(xml.getElementsByTagName(o).item(0));
    }
  }
}


哦,對了,還有個函數getXmlNodeText沒寫,這是用來讀取XML結點內容的函數。說起來真的很不爽,IE和Gecko在XML DOM的介面方面實在太不統一了,連擷取一個結點的內容都不同,IE是.text,Gecko是.textContent。沒辦法,只好寫個函數封裝一下了……


function getXmlNodeText(node) {
  var undefined;

  if (undefined !== node.text) {
    return node.text;
  } else if (undefined !== node.textContent) {
    return node.textContent;
  }
 
  return undefined;
}


接下來就是要寫這個RSS類了。為了把資料和控制分離,這個RSS類並不包含任何遠端存取的代碼,僅僅是根據輸入的xml結點來擷取裡面所有的資料。哦,對了,這個類幾乎完全沒有考慮異常保護的問題……


function RssReader(xml) {
  /** Retrieve the information of the tag "channel" in RSS.
    @param[in] channel The <channel> node, which is the direct child of <rss>
    @return Header object, including title, link and description.
  */
  function getHeader(channel) {
    var header = {
      title: 0,
      link: 0,
      description: 0
    };
   
    getXmlData(channel, header);
  
    return header;
  }
 
  /** Retrieve the information of the tag "item" in RSS.
    @param[in] item The <item> node, which is the direct child of <channel>
    @return Item object, including author, title, link, description and pubDate.
  */
  function getItem(item) {
    var info = {
      author: 0,
      title: 0,
      link: 0,
      description: 0,
      pubDate: 0
    };
   
    getXmlData(item, info);
   
    return info;
  }

  var rss = xml.documentElement;
  var channel = rss.getElementsByTagName("channel").item(0);

  this.header = getHeader(channel);
  this.items = [];
 
  var item = channel.getElementsByTagName("item");
 
  for (var i = 0; i < item.length; i++) {
    this.items.push(getItem(item.item(i)));
  }
}


好了,到最後了!當然是要開始訪問遠端RSS Feed了。嗯,這個東西當然就和XMLHTTP的使用有關了,相關的內容已經很成熟了,我也差不多隻是CP了一下而已,所以當然就在此略去了。

完成之後,寫一點總結和體會:

Javascript中做ORM很簡單,甚至於非常的理所當然。這是因為對於任意一個Object(假設叫obj),它的屬性(假設叫attrib)天生就有兩種訪問方式,obj.attrib和obj["attrib"]。再加上for..in的強大功能,從XML到Javascript Object很容易就無敵了。
從XML到Javascript 對象的過程其實也可以看作從XML到JSON的過程,反過來也很容易實現。嗯,如果把getXmlData加強,就可以得到一個XML直接映射到JSON的解決方案,貌似挺不錯的。
一開始我並不瞭解XMLHTTP的安全性問題,所以相反比較浪漫……後來略微瀏覽了一下AJAX in Action才瞭解這些細節的東西……原來,XMLHTTP對象不能夠隨便訪問任意一個網站,只能訪問當前網站下的其他網頁。如果這樣做了,瀏覽器就會報錯。嗯,我還試過,如果伺服器Redirect到其他URL,XMLHTTP能夠自動去訪問其他URL,不過在安全性上面還是遵循上面的原則。
嗯,Javascript的東西,真的比較好玩~



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.