免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Rails 與 XML(一)

Posted in Tech at 3:51 pm by Winters Mi

引用地址:http://xerdoc.com/blog/archives/188.html

XML大家都很熟悉,那也就不需要怎么解釋了。這里所說的Rails指的就是目前正如火如荼發(fā)展的Ruby on Rails,因為他的方便快捷,越來越多的人開始對他進行學習和研究。本篇的目的是為了介紹在使用RoR搭建網站時對XML的處理,例如RSS文件的生成等等。首先不得不對這個東西的整體大概介紹一下。
Ruby是早年日本人寫出來的一個解釋型語言,同Python、Perl非常相似,但是更為突出的一點就是他的OO特性,尤其在Rails中。語法其實也不是很難,我差不多花了兩天時間大致了解了整體的語法特性。整體來說與Perl比較類似(跟吉子討論之后總結出來的)。個人覺得比較難以理解和記憶的包括兩點:一是$變量,類似于Perl中的$變量,比如$!總是表示最近發(fā)生的錯誤,$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里面,在實現(xiàn)中會用一個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。現(xiàn)在每天Rails的郵件列表大概我都會收到7、80封信。Rails用的最多的演示就是搭建Blog,我看了幾個,感覺就是使用Rails基本上10分鐘左右就能搭建出一個雛形的Blog系統(tǒng),包括發(fā)貼、刪除、更新、Comment等等,讓人感覺確實非常的驚訝,初期Rails的學習曲線不是很平緩,因為使用Rails建立一個工程,就像MFC一樣,編譯運行,一個頁面就出來了,然后一堆目錄文件都擺在那里,根本不知道什么是什么,不過跟隨一個例子慢慢做,很快就能上手,然后多多利用Rails WikiMaillist,基本上都能找到答案。
ok,進入正題,Rails對于XML的操作。一般無非也就是兩種,創(chuàng)建XML,比如生成RSS文件,另一種就是解析,比如做個RSS閱讀器等等,那今天先來搞搞怎么生成XML,因為這個相對簡單一些,:P(
Rails的Wiki中有一部分內容),我們也可以以RSS為例。希望大家是在對Rails有了一定了解之后,尤其是Rails的Views的概念之后可以來看看這個,呵呵。
XML其實跟HTML一樣都可以是Rails框架中的一個視圖,通過Controller來控制View的產生。一般來說需要作的第一步就是把HTTP的協(xié)議頭改了,因為我們知道HTML和XML的HTTP協(xié)議頭不是完全一樣的,非常簡單,比如我們有一個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中,模板是視圖不可缺少的一部分,模板也是直接展現(xiàn)給用戶的結果。一般的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的頭等等,通過可變長的參數可以改變改節(jié)點的屬性值;
然后需要產生RSS的根節(jié)點,比如我們使用RSS 2.0規(guī)范
xml.rss, :version => ‘2.0‘,               ‘xmlns:dc‘ => ‘http://purl.org/dc/elements/1.1/‘

上面的snippet顯示了如何生成節(jié)點,并且包括了他的屬性,比如版本是2.0,使用dc的namespace,比如我們需要在RSS中支持dc:creator來標明作者是誰。那么又有一個問題了,就是xml對于數據樹型結構的描述,這點完全不是問題,程序結構同生成XML的結構非常類似,不象以前要寫某某節(jié)點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文件的內容了,不過我在做的時候遇到了一個問題,就是節(jié)點的namespace,比如我們要建立一個節(jié)點dc:creator,或者rdf:resource等等,查了一下,因為“:”是Ruby的語法字符,不能向上面那么使用,所以rxml builder有一個方法,叫做xml.tag!,用來專門處理這個,例如
xml.tag! (‘SOAP:Envelope‘)# produces <SOAP:Envelope>...</SOAP:Envelope>

Ruby中有很多有意思的函數,比如isXXXX?,string.sub!,就是函數后面可以用?!這種來表示一定的含義,比如?就是表示布爾函數,!一般表示對原對象的狀態(tài)或者數據會有修改甚至破壞可能的函數,所以覺得這樣寫比較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.

于是,現(xiàn)在就可以直接寫成:

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

呵呵,這樣就比較好看了。

今天就先到這里,后面會正確搞一搞解析XML的,據我所知,目前Ruby打包的XML解析器是rexml,曾經試用過,根Java也是沒有多大區(qū)別的,然后目前也有一個FeedTools,是專門支持Rails中對于RSS的解析的,目前主要版本的RSS都支持。學習Rails很快,作起來也很快,目前看比較適合概念展示用的原型系統(tǒng)等,大型的應用還沒有看到,不過一些老外的網站也都開始招RoR的開發(fā)人員了。還是感覺,如果有什么新的想法,可以很快用RoR搞一個出來,也應了Keso引用的那句話,要“早發(fā)布、常發(fā)布”,呵呵。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Ruby on Rails 學習資料
Sidekiq in Rails
web2.0 總結
rails入門書籍
Ajax 框架
Matrix - 與 Java 共舞 - AJAX:開發(fā)者新的一天
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服