xml - update - ruby parse html string




你會推薦哪個Ruby XML庫用於2.4MB的XML文件? (2)

我有一個2.4 MB的XML文件,從Microsoft Project導出(嘿,我是受害者在這裡!),從中請求我提取某些細節重新演示。 忽略請求的智能或其他方面,我應該從Ruby的角度首先嘗試使用哪個庫?

我知道以下(沒有特定的順序):

我寧願打包成一個紅寶石,我懷疑奇爾卡特庫不是。

表現不是一個大問題 - 我不希望事情需要每天運行超過一次(更可能每週一次)。 我更感興趣的是像XML相關的東西一樣容易使用。

編輯:我試了gemified:

hpricot是一個國家英里,最簡單的。 例如,要提取此XML中的SaveVersion標記的內容(保存在名為test.xml的文件中)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/project">
    <SaveVersion>12</SaveVersion>
</Project>

採取這樣的事情:

doc = Hpricot.XML(open('test.xml'))
version = (doc/:Project/:SaveVersion).first.inner_html

hpricot似乎比較不關心命名空間,在這個例子中是很好的:只有一個,但是對於一個複雜的文檔可能是一個問題。 由於hpricot也很慢,我更想像這將是一個解決自己的問題。

libxml-ruby的速度要快上一個數量級,理解命名空間(我花了好幾個小時才弄清楚),並且更接近於XML金屬 - XPath查詢以及其他所有內容。 如果像我一樣,只有在極端的脅迫條件下才開放XML文檔,這不一定是好事。 幫助程序模塊在提供如何有效地處理默認名稱空間的示例方面很有幫助。 這大概就是我最後的結果(我不以任何方式主張它的美麗,正確性或其他價值,這正是我現在所處的位置):

xml_parser = XML::Parser.new
xml_parser.string = File.read(path)
doc = xml_parser.parse
@root = doc.root
@scopes = { :in_node => '', :in_root => '/', :in_doc => '//' }
@ns_prefix = 'p'
@ns = "#{@ns_prefix}:#{@root.namespace[0].href}"
version = @root.find_first(xpath_qry("Project/SaveVersion", :in_root), @ns).content.to_i

def xpath_qry(tags, scope = :in_node)
  "#{@scopes[scope]}" + tags.split(/\//).collect{ |tag| "#{@ns_prefix}:#{tag}"}.join('/')
end

我仍然在辯論利弊:libxml的更嚴格的,hpricot純粹的_why代碼的風格。

稍後再編輯一下:我發現HappyMapper('gem install happymapper'),如果還處於早期階段,它是非常有前景的。 這是聲明性的,主要是工作,雖然我發現了一些邊緣情況下,我還沒有修復。 它可以讓你做這樣的東西,解析我的Google閱讀器OPML:

module OPML
  class Outline
    include HappyMapper
    tag 'outline'
    attribute :title, String
    attribute :text, String
    attribute :type, String
    attribute :xmlUrl, String
    attribute :htmlUrl, String
    has_many :outlines, Outline
  end
end

xml_string = File.read("google-reader-subscriptions.xml")

sections = OPML::Outline.parse(xml_string)

我已經喜歡它,儘管它還不完美。


Hpricot可能是最適合你的工具 - 使用起來很方便,應該可以處理2mg的文件。

快速的libxml應該是最好的。 幾個月前,我用pyx的libxml2綁定(那時候rb-libxml是陳舊的)。 流接口對我來說是最好的(Ruby中的LibXML :: XML :: Reader)。 它允許在下載時處理文件,比SAX更友好一些,並允許我在一分多鐘之內從互聯網上的30mb xml文件加載數據到MySQL數據庫。


Nokogiri用一個乾淨的Rubyish API封裝了libxml2和libxslt,它支持命名空間,XPath和CSS3查詢。 也快。 http://nokogiri.org/





ruby