nokogiri只返回一个项目

时间:2014-09-21 18:18:56

标签: ruby xml nokogiri

我将方法称为“读取”并仅从xml文件中返回一项

方法“读取”返回:

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

1 个答案:

答案 0 :(得分: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>元素。


此外,我可以建议您使用更多Ruby-esque代替您的while循环:

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