rails:Rails 与 XML

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如下:
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' endend


第二步就是要生成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行
<?xml version='1.0' encoding='utf-8' ?>

在rxml文件中对应的就是
xml.instruct!

xml.instruct!用来控制产生xml中instruction,类似于xml的头等等,通过可变长的参数可以改变改节点的属性值;
然后需要产生RSS的根节点,比如我们使用RSS 2.0规范
xml.rss, :version => '2.0', 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/'

上面的snippet显示了如何生成节点,并且包括了他的属性,比如版本是 2.0,使用dc的namespace,比如我们需要在RSS中支持dc:creator来标明作者是谁。那么又有一个问题了,就是xml对于数据树型结构的描述,这点完全不是问题,程序结构同生成XML的结构非常类似,不象以前要写某某节点appendChild什么的,在Rails的rxml中,非常简单
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的树型框架,完全用程序的嵌套特性完成了对于 XML树型数据结构的构造,简单吧。其实基本上上述就涵盖了构建XML文件的内容了,不过我在做的时候遇到了一个问题,就是节点的namespace,比如我们要建立一个节点dc:creator,或者rdf:resource等等,查了一下,因为“:”是Ruby的语法字符,不能向上面那么使用,所以 rxml builder有一个方法,叫做xml.tag!,用来专门处理这个,例如
xml.tag! ('SOAP:Envelope')# produces <SOAP:Envelope>...</SOAP:Envelope>

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

呵呵,这样就比较好看了。
今天半
Tags:  rails分页 rails

延伸阅读

最新评论

发表评论