`
chinapkw
  • 浏览: 110901 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rails 生成rss

阅读更多

原文:http://xerdoc.com/blog/archives/188.html

XML大家都很熟悉,那也就不需要怎么解释了。这里所说的Rails指的就是目前正如火如荼发展的Ruby on Rails,因为他的方便快捷,越来越多的人开始对他进行学习和研究。本篇的目的是为了介绍在使用RoR搭建网站时对XML的处理,例如RSS文件的生成等等。首先不得不对这个东西的整体大概介绍一下。
Ruby是早年日本人写出来的一个解释型语言,同Python、Perl非常相似,但是更为突出的一点就是他的OO特性,尤其在Rails中。语法其实也不是很难,我差不多花了两天时间大致了解了整体的语法特性。整体来说与Perl比较类似(跟吉子讨论之后总结出来的)。个人觉得比较难以理解和记忆的包括两点:一是$变量,类似于Perl中的$变量,比如$!总是表示最近发生的错误,$1表示正则表达式匹配的第一部分等等,因为实在是很多,所以记忆起来确实还是比较头疼的;第二是Block语法,Ruby中比较强大的一点也是这个,即增强了对于容器迭代处理的本领,拿Java的处理来做个比较,比如在Java1.4中对于一个列表的迭代处理可以是这样的:

在Java5.0中对于迭代也是加强了很多,可以这样做:

在Ruby中就可以这样写:

其实看上去没有什么特殊的,呵呵,不过玄机是在这个list.each里面,在实现中会用一个yield来呼喊跟在后面的Block对象,理解上也不是很困难,不过看一个例子:

这段败家玩意是用来算菲波那切数列的,我头一天几乎就晕菜在这了,后来才慢慢明白。以上就是我所感觉Ruby中比较困难的一些地方。
下面来说说Rails,呵呵

Rails可以说是一个很成功的MVC的框架,他的作者也在最近的OSCON大会上被Google、Yahoo等多个商家评为本年度最佳Hacker。现在每天Rails的邮件列表大概我都会收到7、80封信。Rails用的最多的演示就是搭建Blog,我看了几个,感觉就是使用Rails基本上10分钟左右就能搭建出一个雏形的Blog系统,包括发贴、删除、更新、Comment等等,让人感觉确实非常的惊讶,初期Rails的学习曲线不是很平缓,因为使用Rails建立一个工程,就像MFC一样,编译运行,一个页面就出来了,然后一堆目录文件都摆在那里,根本不知道什么是什么,不过跟随一个例子慢慢做,很快就能上手,然后多多利用Rails WikiMaillist,基本上都能找到答案。
ok,进入正题,Rails对于XML的操作。一般无非也就是两种,创建XML,比如生成RSS文件,另一种就是解析,比如做个RSS阅读器等等,那今天先来搞搞怎么生成XML,因为这个相对简单一些,:P(Rails的Wiki中有一部分内容),我们也可以以RSS为例。希望大家是在对Rails有了一定了解之后,尤其是Rails的Views的概念之后可以来看看这个,呵呵。
XML其实跟HTML一样都可以是Rails框架中的一个视图,通过Controller来控制View的产生。一般来说需要作的第一步就是把HTTP的协议头改了,因为我们知道HTML和XML的HTTP协议头不是完全一样的,非常简单,比如我们有一个RSS Controller,rss这个动作是用来生成RSS XML的,简单的snippet如下:

第二步就是要生成rss视图的模板。在Rails中,模板是视图不可缺少的一部分,模板也是直接展现给用户的结果。一般的Rails模板都是rhtml文件,对于我们的例子,rss的模板需要是生成xml的,所以,就是rss.rxml。在Rails中,处理和使用rxml模板文件的工作是由Rxml Builder来完成的,就像他的项目介绍所说的“Provide a simple way to create XML markup and data structures.”真的非常简单。
比如,我们需要先生成xml的instruct行

在rxml文件中对应的就是

xml.instruct!用来控制产生xml中instruction,类似于xml的头等等,通过可变长的参数可以改变改节点的属性值;
然后需要产生RSS的根节点,比如我们使用RSS 2.0规范

上面的snippet显示了如何生成节点,并且包括了他的属性,比如版本是2.0,使用dc的namespace,比如我们需要在RSS中支持dc:creator来标明作者是谁。那么又有一个问题了,就是xml对于数据树型结构的描述,这点完全不是问题,程序结构同生成XML的结构非常类似,不象以前要写某某节点appendChild什么的,在Rails的rxml中,非常简单

从上面的框架直接生成了xml的树型框架,完全用程序的嵌套特性完成了对于XML树型数据结构的构造,简单吧。其实基本上上述就涵盖了构建XML文件的内容了,不过我在做的时候遇到了一个问题,就是节点的namespace,比如我们要建立一个节点dc:creator,或者rdf:resource等等,查了一下,因为“:”是Ruby的语法字符,不能向上面那么使用,所以rxml builder有一个方法,叫做xml.tag!,用来专门处理这个,例如

Ruby中有很多有意思的函数,比如isXXXX?,string.sub!,就是函数后面可以用?!这种来表示一定的含义,比如?就是表示布尔函数,!一般表示对原对象的状态或者数据会有修改甚至破坏可能的函数,所以觉得这样写比较ugly,于是接着找,找到了一句话

for( int i = 0; i < list.size(); ++i) {
     String aString = (String)list.get(i);
     System.out.println(aString);
}
 

 

for(String aString: list) {
     System.out.println(aString);
}

 

list.each { |aString| puts aString}

 

def fibUpTo(max)
     i1, i2 = 1, 1        # parallel assignment
     while i1 < = max
          yield i1
          i1, i2 = i2, i1+i2
     end
end
fibUpTo(500) { |f| print f, ' ' }
#1 1 2 3 5 8 13 21 34 55 89 144 233 377
 

 

class RSSController < ApplicationController
   before_filter :set_xml_header

   # action to create rss xml file, but have to change
   # HTTP header before
   def rss
   end

   def set_xml_header
     @headers['Content-Type'] = 'text/xml; character=utf-8'
   end
end
 

 

<!---->

 

xml.instruct!

 

xml.rss, :version => '2.0',
               'xmlns:dc' => 'http://purl.org/dc/elements/1.1/'

 

xml.rss, :version => '2.0',
               'xmlns:dc' => 'http://purl.org/dc/elements/1.1/ do
      xml.channel ... do
          xml.title ...
          xml.link ...
          xml.item ... do
               xml.title ...
               ...
          end
      end
  end

 

xml.tag! ('SOAP:Envelope')
# produces <soap:envelope>...</soap:envelope>

 

Direct support for XML namespaces is now available. If the first argument to a tag call is a symbol, it will be joined to the tag to produce a namespace:tag combination. It is easier to show this than describe it.

于是,现在就可以直接写成:

呵呵,这样就比较好看了。

xml.dc :creator, 'Winters Mi'
#produces <dc:creator>Winters Mi</dc:creator>

 

今天就先到这里,后面会正确搞一搞解析XML的,据我所知,目前Ruby打包的XML解析器是rexml,曾经试用过,根Java也是没有多大区别的,然后目前也有一个FeedTools,是专门支持Rails中对于RSS的解析的,目前主要版本的RSS都支持。学习Rails很快,作起来也很快,目前看比较适合概念展示用的原型系统等,大型的应用还没有看到,不过一些老外的网站也都开始招RoR的开发人员了。还是感觉,如果有什么新的想法,可以很快用RoR搞一个出来,也应了Keso引用的那句话,要“早发布、常发布”,呵呵。

分享到:
评论
1 楼 chinapkw 2007-09-26  
http://wiki.rubyonrails.com/rails/pages/HowtoGenerateXml
参考

相关推荐

    rails制作rss feed代码

    方法B则利用Rails的模板系统来生成RSS Feed。在控制器中,定义同样名为`feed`的方法: ```ruby def feed @posts = Post.find(:all, :order =&gt; 'id DESC') end ``` 接着,创建一个erb模板`views/post/feed.atom....

    应用Rails进行REST开发

    Rails框架中的Scaffolding工具是一种自动生成控制器、视图和模型的机制,极大地加速了开发过程。当使用Scaffolding时,开发者可以快速搭建起符合REST风格的基础应用程序,包括基本的CRUD操作。这不仅节省了大量的...

    Ruby-Publify一个构建在Rails之上的自我托管We发布平台

    7. **RSS订阅**:自动生成RSS feed,方便订阅者获取最新内容。 8. **统计分析**:提供基础的访问统计,如访问量、页面浏览等,还可以集成Google Analytics等第三方统计工具。 9. **安全与备份**:Publify有安全...

    Build.Your.Own.Ruby.on.Rails.Web.Applications.Feb.2007.pdf

    - **辅助函数**:讲解如何使用Rails提供的辅助函数来简化HTML和CSS的生成。 - **表单处理**:说明如何构建和处理Web表单,以及如何使用Rails的表单助手。 - **布局设计**:教授如何使用布局文件来共享通用的页面元素...

    github-activity:GitHub活动RSS提要

    总之,这个GitHub活动RSS提要应用是一个基于Ruby的Web服务,它可以生成RSS订阅链接,帮助你轻松获取和跟踪GitHub上的个人或组织活动。通过创建无权限的访问令牌和(如果需要)OAuth应用,你可以确保安全地连接到...

    hackershare:Hackershare是一个功能强大的社交书签服务和一个知识共享社区,具有高级搜索和标签管理功能

    cp .docker.env .env生成图像。 docker-compose build构建映像或破坏堆栈后,您必须使用以下命令重置数据库。 docker-compose run --rm rails bundle exec rails db:createdocker-compose run --rm rails bundl

    rss-wwwid:WWWID挑战

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态&lt;met

    sv-police-rss-map

    该项目是通过引导的。 您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面&lt;title&gt; 安装依赖项 ... 在服务器上生成动态&lt;met

    redmine-2.6.7 For windows平台

    此外,还支持通过邮件通知和RSS订阅来实时跟进问题的进展。 7. **版本控制集成**:Redmine可以与Git、SVN等版本控制系统集成,显示代码变更历史,关联问题和版本,帮助团队更好地管理代码。 8. **时间跟踪**:对于...

    tagteam-dev_html_javascript_ruby_css_

    Rails框架是Ruby的一个流行选择,它提供了MVC(模型-视图-控制器)架构,使得开发高效且结构清晰。例如,使用ActiveRecord处理数据库操作,通过ActionController处理HTTP请求,并用ERB(Embedded Ruby)模板生成HTML...

    Redmine安装使用说明文档

    - **生成报表**:根据记录的时间生成统计报表,分析项目进度。 ##### 5. 其他功能 - **Wiki文档**:创建项目文档,方便团队成员查阅。 - **新闻公告**:发布项目更新或重要通知。 - **问题跟踪**:跟踪项目中的...

    50个非常有用的PHP工具(20211010005844).pdf

    - **CakePHP**: 基于MVC的开源PHP框架,灵感来源于Ruby on Rails。 - **Savant2**: 另一个PHP模板引擎,强调简洁和性能。 这些工具和框架覆盖了PHP开发的各个方面,从调试到测试,再到文档生成和安全防护,以及...

    网站模块

    - 后端框架:如Django、Ruby on Rails、Express.js等,处理服务器端逻辑和数据交互。 - 数据库管理:MySQL、MongoDB、PostgreSQL等,存储和检索网站数据。 - API集成:利用RESTful API或GraphQL与第三方服务进行...

    Laravel开发-support

    1. **Laravel框架**: Laravel是由Taylor Otwell开发的,其设计灵感来源于Ruby on Rails。Laravel引入了MVC(模型-视图-控制器)架构模式,简化了Web开发流程,提供了丰富的特性如路由、中间件、Eloquent ORM、...

    Weavercast:个人播客网站

    虽然具体技术栈未在标签中提及,但为了处理用户登录、音频文件存储、RSS生成等功能,Weavercast很可能使用了某种后端框架,如Node.js(搭配Express)、Django或Ruby on Rails。数据库系统(如MySQL、PostgreSQL或...

    Redmine使用手册

    Redmine是一款基于Ruby on Rails(ROR)框架开发的开源项目管理系统,它以其灵活的项目管理功能和丰富的集成能力而受到广泛欢迎。Redmine的设计灵感来源于Basecamp的ROR版本,它不仅支持多种数据库,还能与多种版本...

    PHP开发框架比较

    - **Ruby on Rails风格**: 类似于Ruby on Rails的设计理念,具有相似的ActiveRecord功能。 - **文档**: 文档相对较少,限制了用户的理解和学习过程。 - **Ajax支持**: 内置了Ajax支持,增强了用户体验。 ### 结论 ...

    Addison Wesley The Ruby Way 2Nd Edition Oct 2006.pdf(英文版)

    17. **开发工具**:最后介绍了Ruby开发过程中的各种工具,包括集成开发环境(IDE)、文档生成工具等。 通过以上内容的详细讲解,《The Ruby Way》第二版为读者提供了全面且深入的Ruby编程知识体系,无论是对于初学者...

    理解 Zend 框架(IBM经典中文教程)

    - **作用**:用于处理 RSS 和 Atom 格式的 Feed 数据。 - **特点**:可以方便地从 Feed 中提取信息,也可以生成自己的 Feed。 ##### 3.4 Zend_Filter - **作用**:提供了多种过滤器,用于数据的格式化和清理。 - *...

Global site tag (gtag.js) - Google Analytics