从xml文件中读取随机行

时间:2011-02-15 02:38:02

标签: ruby-on-rails ruby xml

我有一个xml文件,如:

<root>
<car>honda</car>
<car>toyota</car>
</root>

现在我想加载xml,并从中选择一个随机行并返回汽车标签的内容,即单词honda或toyota。

我在网站上使用它来使用rails 3显示每页随机行请求。

2 个答案:

答案 0 :(得分:2)

require 'nokogiri'

def random_car
  doc = Nokogiri::XML.parse(File.open('cars.xml'))
  cars = doc.xpath('//car').to_a
  cars.sample.try(:text)
end

请注意Array#sample是一个ActiveSupport 3函数,它在Rails 3中自动可用,而Nokogiri是您需要安装的gem(将其添加到您的Gemfile中)。

如果没有与XPath搜索匹配的话,使用Object#try确保函数仍然有效(返回nil),因为如果数组为空,Array#sample返回nil。

为了加快速度(如果XML文件很大),请在某处缓存汽车列表,例如常量。这不会重新加载文件,因此如果您希望更改XML文件,则可能不希望这样做。

CARS = Nokogiri::XML.parse(File.open('cars.xml')).xpath('//car').to_a

def random_car
  CARS.sample.try(:text)
end

答案 1 :(得分:0)

以下是我如何去做的事情:

require 'nokogiri'

# added some cars to make it more interesting
xml = <<EOT
<root>
    <car>honda</car>
    <car>toyota</car>
    <car>ford</car>
    <car>edsel</car>
    <car>de lorean</car>
    <car>nissan</car>
    <car>bmw</car>
    <car>volvo</car>
</root>
EOT

doc = Nokogiri::XML(xml)

# doc.search('car') returns a nodeset. 
# to_a converts the nodeset to an array.
# shuffle returns a randomly sorted array.
# first returns the element 0 from the randomly sorted array.
# to_xml merely converts it back to the text representation of the XML so it's easy to see what was selected.
doc.search('car').to_a.shuffle.first.to_xml # => "<car>toyota</car>"
doc.search('car').to_a.shuffle.first.to_xml # => "<car>edsel</car>"
doc.search('car').to_a.shuffle.first.to_xml # => "<car>volvo</car>"