日期:2014-04-16  浏览次数:21096 次

这几天在学习一些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++) {