Rails 与 XML(一)

来源:百度文库 编辑:神马文学网 时间:2024/04/28 00:27:22
Posted inTech at 3:51 pm by Winters Mi
引用地址: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中对于一个列表的迭代处理可以是这样的:
for( int i = 0; i < list.size(); ++i) { String aString = (String)list.get(i); System.out.println(aString);}
在Java5.0中对于迭代也是加强了很多,可以这样做:
for(String aString: list) { System.out.println(aString);}
在Ruby中就可以这样写:
list.each { |aString| puts aString}
其实看上去没有什么特殊的,呵呵,不过玄机是在这个list.each里面,在实现中会用一个yield来呼喊跟在后面的Block对象,理解上也不是很困难,不过看一个例子:
def fibUpTo(max) i1, i2 = 1, 1 # parallel assignment while i1 < = max yield i1 i1, i2 = i2, i1+i2 endendfibUpTo(500) { |f| print f, ‘ ‘ }#1 1 2 3 5 8 13 21 34 55 89 144 233 377
这段败家玩意是用来算菲波那切数列的,我头一天几乎就晕菜在这了,后来才慢慢明白。以上就是我所感觉Ruby中比较困难的一些地方。
下面来说说Rails,呵呵
Rails可以说是一个很成功的MVC的框架,他的作者也在最近的OSCON大会上被Google、Yahoo等多个商家评为本年度最佳Hacker。现在每天Rails的邮件列表大概我都会收到7、80封信。Rails用的最多的演示就是搭建Blog,我看了几个,感觉就是使用Rails基本上10分钟左右就能搭建出一个雏形的Blog系统,包括发贴、删除、更新、Comment等等,让人感觉确实非常的惊讶,初期Rails的学习曲线不是很平缓,因为使用Rails建立一个工程,就像MFC一样,编译运行,一个页面就出来了,然后一堆目录文件都摆在那里,根本不知道什么是什么,不过跟随一个例子慢慢做,很快就能上手,然后多多利用Rails Wiki和Maillist,基本上都能找到答案。
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行

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