2014-02-14 32 views
3

我想打開一個外部XML文件,解析它並使用數據存儲在我的數據庫中。我這樣做有引入nokogiri很簡單:如何使用Nokogiri gem打開,解析和處理Ox文件的XML文件?

file = '...external.xml' 
xml = Nokogiri::XML(open(file)) 

xml.xpath('//Element').each do |element| 
    # process elements and save to Database e.g.: 
    @data = Model.new(:attr => element.at('foo').text) 
    @data.save  
end 

現在我想嘗試(也許更快)牛年寶石(https://github.com/ohler55/ox) - 但我不明白如何打開和處理來自紀錄片的文件。

上述代碼的任何等效代碼示例都會很棒!謝謝!

+1

我不知道牛。它似乎比Nokogiri更快。牛可能會接管Nokogiri嗎? – sawa

+1

可能不是。牛非常快,但僅支持Nokogiri提供的一小部分功能。例如,如果您需要XPath支持,適當的名稱空間支持,XSLT等,那麼Ox實際上並不是一個有效的選項。不要淡化牛的價值 - 它只是有一個更有限的應用。 –

回答

8

你不能使用XPath在牛年來定位節點,但牛年確實提供了一個locate方法。您可以使用它像這樣:

xml = Ox.parse(%Q{ 
    <root> 
    <Element> 
     <foo>ex1</foo> 
    </Element> 
    <Element> 
     <foo>ex2</foo> 
    </Element> 
    </root> 
}.strip) 

xml.locate('Element/foo/^Text').each do |t| 
    @data = Model.new(:attr => t) 
    @data.save  
end 

# or if you need to do other stuff with the element first 
xml.locate('Element').each do |elem| 
    # do stuff 
    @data = Model.new(:attr => elem.locate('foo/^Text').first) 
    @data.save  
end  

如果查詢沒有找到任何匹配,它會返回一個空數組。有關locate查詢參數的簡要說明,請參閱element.rb處的源代碼。

0

the documentation

doc2 = Ox.parse(xml) 

要閱讀的Ruby文件的內容,你可以使用xml = IO.read('filename.xml')(等等)。所以:

doc = Ox.parse(IO.read(filename)) 

如果您的XML文件是UTF-8編碼,然後或者:

doc = Ox.parse(File.open(filename,"r:UTF-8",&:read)) 
+0

感謝您的快速回復。打開並解析到目前爲止的工作「但是,如何通過」xml.xpath('// Element')來瀏覽內容。每個「 - xpath不能用作doc.xpath ... – Bob

+0

我沒有看到這個作爲你的原始問題的一部分,你基本上都在問,「我如何使用Ox,就像所有的一樣?」我不會回答這個問題,因爲恕我直言,你現在已經超出了Stack Overflow的範圍。並不是你已經閱讀過文檔,或者試圖自己去解決這個問題。 – Phrogz

+2

@Phrogz,對@Bob公平,沒有太多的文檔,特別是'locate'方法,我只能找到解釋自定義查詢語言Ox在'lib/ox/element.rb'文件中使用 –