我有一个xml文件,如:
<root>
<car>honda</car>
<car>toyota</car>
</root>
现在我想加载xml,并从中选择一个随机行并返回汽车标签的内容,即单词honda或toyota。
我在网站上使用它来使用rails 3显示每页随机行请求。
答案 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>"