2014-09-21 88 views
0

我調用該方法「閱讀」,只有從XML文件中返回一個項目引入nokogiri返回一個項目

方法「」迴歸:

9 
3 
max 
date 
5 

,而應返回的所有項目從xml

如何從方法讀取得到整個xml?

require 'nokogiri' 
require 'open-uri' 

def create 
    var = 0 
    while var < 10 
    builder = Nokogiri::XML::Builder.new do 
     item { 
     data var 
     port '3' 
     length 'max' 
     date 'date' 
     limit '5' 
     } 
     var += 1 
    end 
    end 
    return Nokogiri::XML(builder.to_xml).root.to_xml 
end 

def read  
    doc = Nokogiri::XML(create) 
    doc.xpath('//item').each do |item| 
    data = item.at_xpath('./data').content 
    port = item.at_xpath('./port').content 
    length = item.at_xpath('./length').content 
    date = item.at_xpath('./date').content 
    limit = item.at_xpath('./limit').content 

    puts data 
    puts port 
    puts length 
    puts date 
    puts limit 
    end 
end 

read 

回答

0

您的read方法很好。問題在於XML文檔不是您認爲的那樣。如果你看看你create方法的輸出,它會創建僅此文件:

<?xml version="1.0"?> 
<item> 
    <data>9</data> 
    <port>3</port> 
    <length>max</length> 
    <date>date</date> 
    <limit>5</limit> 
</item> 

這是因爲你創建(並重新創建,並重新創建)文檔內,您的while循環。相反,你想要做這樣的事情:

def create 
    var = 0 
    builder = Nokogiri::XML::Builder.new do 
    root do 
     while var < 10 
     item { 
      data var 
      port '3' 
      length 'max' 
      date 'date' 
      limit '5' 
     } 
     var += 1 
     end 
    end 
    end 
    return Nokogiri::XML(builder.to_xml).root.to_xml 
end 

注意,我添加了一個<root>元素來包裝所有項目,因爲一個XML文檔只能有一個根元素,你似乎是添加多個<item>元素。


此外,我可能會建議,而不是你while循環使用更多的紅寶石去年秋季:

10.times do |var| 
    # no need to var += 1 here 
    # the rest of your code 
end