欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Rails 與 XML(二)

Posted in Tech at 2:18 pm by Winters Mi

轉自:http://xerdoc.com/blog/archives/190.html

我也沒(méi)想到這么快就可以開(kāi)始寫(xiě)第二部分,也就是在網(wǎng)站中解析XML,比如訂閱了別人的RSS等等,我們需要對其進(jìn)行解析來(lái)完成自己的功能。我們都知道XML在訂閱中的作用越來(lái)越重要,從Meng Yan的一篇Subscribe using XML中就可以看到將來(lái)這種技術(shù)的發(fā)展趨勢?,F在也是越來(lái)越多的應用圍繞著(zhù)這些XML展開(kāi),比如RSS搜索,RSS Aggregator等等。但是老實(shí)說(shuō),解析這部分沒(méi)有什么特別需要說(shuō)明的,因為不管是Standalone還是Server Side的XML解析都是一樣的,就是解析嘛。但是也不應該因為沒(méi)什么可說(shuō)就胡弄各位,所以,盡量找點(diǎn)有意思的話(huà)題來(lái)說(shuō)說(shuō)這部分。我也會(huì )在本文中給出一個(gè)非常非常簡(jiǎn)單的小功能,包括了爬蟲(chóng)和解析,呵呵,大話(huà)先放這里,估計看完了,不少人開(kāi)始扔雞蛋了。
再說(shuō)點(diǎn)題外話(huà),其實(shí)老實(shí)說(shuō)Rails跟XML本身聯(lián)系不是很緊密,解析XML就更沒(méi)有什么關(guān)系,不像Rails與XML第一篇中那樣,起碼Rails還提供了一個(gè)非常方便簡(jiǎn)單的rxml模板。那這里解析XML更大程度上是Ruby的事情,所以,先解釋一下,大家別誤會(huì ),同時(shí)為了閱讀的連貫,我也就沒(méi)有改標題了。

Ruby中的XML處理器

XML處理器真的是有很多,涉及到的模型也很多,做Java的人一定知道,大大小小的XML處理器也夠你眼花繚亂的了。在Ruby中,也有不少的XML處理器,起初應該是Ruby對于native XML處理器的綁定,也就是利用native code的XML處理器,這個(gè)當然速度會(huì )比較快,但是因為應用了native code,所以移植性就會(huì )有一些影響了。那后來(lái)的一些XML處理器,使用Ruby來(lái)實(shí)現,但是API也是非常復雜,我用過(guò)一個(gè)日本人的XML處理器,也是隨現在Ruby一同發(fā)布的一個(gè),試了SAX Event的parser,試了DOM的parser,都出現一些問(wèn)題,可能也是我不求甚解,沒(méi)有過(guò)多理會(huì ),就將目光移到了REXML上面。
我起初并沒(méi)有覺(jué)得REXML會(huì )有什么不同,直到我看到他作者的一些考慮之后,倒是覺(jué)得有點(diǎn)意思了,也開(kāi)始學(xué)習一些深入的用法,當然現在還在學(xué),呵呵。他的作者有感于目前一些XML處理器的復雜龐大,接口不良好,當然也從Java陣營(yíng)參考了很多實(shí)現(我覺(jué)得dom4j就很龐大,我們開(kāi)發(fā)桌面的時(shí)候用dom4j,整個(gè)程序的大小簡(jiǎn)直有個(gè)質(zhì)的飛躍:(),就有了如下的考慮:

I dislike obfuscated APIs. There are several XML parser APIs for Java. Most of them follow DOM or SAX, and are very similar in philosophy with an increasing number of Java APIs. Namely, they look like they were designed by theorists who never had to use their own APIs. The extant XML APIs, in general, suck. They take a markup language which was specifically designed to be very simple, elegant, and powerful, and wrap an obnoxious, bloated, and large API around it. I was always having to refer to the API documentation to do even the most basic XML tree manipulations; nothing was intuitive, and almost every operation was complex.

REXML的作者發(fā)現了Electric XML(就此我才知道REXML這個(gè)名字是怎么來(lái)的,不過(guò)我沒(méi)有試用過(guò)Electric XML,有興趣的Google一下吧,呵呵)。

First, the library is small; less than 500K. Next, the API is intuitive. You want to parse a document? doc = new Document( some_file ). Create and add a new element? element = parent.addElement( tag_name ). Write out a subtree?? element.write( writer ). Now how about DOM? To parse some file: parser = new DOMParser(); parser.parse( new InputSource( new FileInputStream( some_file ) ) ) Create a new element? First you have to know the owning document of the to-be-created node (can anyone say “global variables, or obtuse, multi-argument methods”?) and call element = doc.createElement( tag_name ) parent.appendChild( element ) “appendChild”? Where did they get that from? How many different methods do we have in Java in how many different classes for adding children to parents? addElement()? add()? put()? appendChild()? Heaven forbid that you want to create an Element elsewhere in the code without having access to the owning document.

恩,我也喜歡小的開(kāi)發(fā)包,我不想我的程序邏輯本來(lái)只有200k,加個(gè)包進(jìn)來(lái)就變成2、3M;我也喜歡比較直觀(guān)的API,以前用jdom來(lái)生成一個(gè)表達式的XML費勁死了,我后來(lái)一般生成XML如果不涉及編碼問(wèn)題的話(huà),我都直接寫(xiě),一個(gè)表達式,一遞歸下降,得,XML樹(shù)就出來(lái)了,比appendChild快多了,有點(diǎn)過(guò),呵呵,總之,直觀(guān)得API會(huì )給開(kāi)發(fā)人員非常舒適得滿(mǎn)意度,呵呵。所以,我也就把目光放到了REXML上,而現在release版本得Ruby中,REXML也是隨同一起發(fā)行的,所以,用起來(lái)很方便,不用額外再去gem了。

小片段:先來(lái)看看怎么爬

回到開(kāi)頭說(shuō)過(guò)的那個(gè)例子,比如我要做類(lèi)似Planet Eclipse這樣的RSS聚合工具或者網(wǎng)站,我就需要去訂閱相關(guān)方面的RSS,并且要去上面爬,然后解析,那么我們先看看Ruby中如何去爬這些XML源,其實(shí)也是非常簡(jiǎn)單。Ruby的Net Module中提供了FTP、HTTP、POP、SMTP、TELNET等很多網(wǎng)絡(luò )協(xié)議的實(shí)現,所以,很方便

  require ‘net/http‘	  h = Net::HTTP.new ‘feeds.feedburner.com‘, 80  resp, data = h.get ‘/xerdoc‘, nil  aString = ‘‘  aString += ‘Code = ‘ + resp.code.to_s + ‘<br />‘  aString += ‘Message = ‘ + resp.message + ‘<br />‘  resp.each { |key, val| aString += key + ‘ = ‘ + val + ‘<br />‘ }  aString += ‘Datagram Length : ‘+ data.length.to_s + ‘<br />‘  render_text aString  data.inspect      # real http data packet

上面一段snippet就是去爬Xerdoc的feedburner的示例,爬回來(lái)的結果就是
  Code = 200  Message = OK  last-modified = Thu, 18 Aug 2005 14:08:33 GMT  connection = close  content-type = text/xml;charset=utf-8  etag = BwYHNkx/OBe7DlAfqnqxeOKjuoE  date = Fri, 19 Aug 2005 05:36:01 GMT  server = Apache  transfer-encoding = chunked

真正的數據都在data中,當然這只是一個(gè)非常簡(jiǎn)單的小爬蟲(chóng),真實(shí)的小爬蟲(chóng)要復雜的多,要去調度,要去協(xié)調資源,不過(guò)對于一個(gè)小的展示系統來(lái)說(shuō),這樣就可以了,調度交給數據庫和簡(jiǎn)單的調度代碼就可以了。

REXML的直觀(guān)API

ok,我們已經(jīng)把Xerdoc的RSS給爬回來(lái)了,該入庫加工上色了,那首先要做的當然就是解析他。
從爬蟲(chóng)送回來(lái)的XML可以作為String直接傳遞給下一個(gè)工人,讓他干活,也可以存到Server Side的文件中,扔到流水線(xiàn)上。無(wú)論那種方式REXML的API都很直觀(guān),解析內容也非常簡(jiǎn)單。
首先,當然是要引入REXML的Module,然后搞個(gè)DOM對象出來(lái),然后就做吧:

  require ‘rexml/document‘	  #... crawler craws the data or  #... data file in the queue  doc = REXML::Document.new xmlstring  # could be xmlfile

我們前面說(shuō)過(guò)Ruby本身提供的Blocks是非常強大的迭代處理工具,在加上Ruby的正則實(shí)現非???,據說(shuō)是本地代碼。所以,REXML繼承了這些優(yōu)良特性,提供了很好的節點(diǎn)迭代處理,以及完整的XPath 1.0的支持,這點(diǎn)是REXML在A(yíng)PI方面最直觀(guān)的方面。Ok,干活,從Xerdoc抓回來(lái)的RSS是RSS 2.0(這點(diǎn)我很奇怪,從Firefox中直接看的話(huà),是Atom規范的,抓回來(lái)的就成了RSS 2.0的了),為了演示方便,我把所有文章的標題抓出來(lái),我需要產(chǎn)生這樣的結果,

  昨夜·討論·難產(chǎn)  Rails 與 XML(一)  探討關(guān)于“壟斷工廠(chǎng)”的實(shí)現  An architecture of participation  Subscribe using XML  Xerdoc一歲了,呵呵  追星族——OpenSourceSummit  Tag your Java source code with Tiger’s annotation  Longhorn中的RSS  Dissect WordPress Plugin

那么最直接的方式就是這樣的,利用XPath直接定位到每條item的title上,

  doc.elements.each(‘rss/channel/item/title‘) { |element|     aString += subelement.text + ‘<br />‘  }

當然,這不符合解析整個(gè)Item的習慣,所以,有了這個(gè)版本,你可以在其中添加解析作者、發(fā)表日期的部分
  doc.elements.each(‘rss/channel/item‘) { |element|    element.elements.each { |subelement|      case subelement.name        when ‘title’          aString += subelement.text + ‘<br />’        when ‘pubData’          ….      end    }  }

感覺(jué)怎么樣,這樣的API是不是感覺(jué)非常的清爽,呵呵。剩下的事情也就是建立Channel的Model,然后在解析中加入對不同規范的判斷,將數據統一適配到Channel的模型中,入庫加工上色發(fā)表。目前有一個(gè)正在Rails中進(jìn)展的開(kāi)源項目,叫做FeedTools,基本上完成的就是上述工作,不過(guò)要遠比我這幾句話(huà)復雜的多,有興趣的朋友可以去參乎參乎。

我也就是說(shuō)說(shuō)還行,呵呵。這個(gè)系列應該是就這兩篇了,也是對自己前段學(xué)習的一段總結,希望能夠對大家有所幫助。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Web設計書(shū)選擇
Ruby on Rails 學(xué)習資料
rails入門(mén)書(shū)籍
Ajax 框架
Matrix - 與 Java 共舞 - AJAX:開(kāi)發(fā)者新的一天
以表單為中心的Ruby on Rails面向表單編程
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久