2011-02-15 3 views
1

XML 파일에서 임의의 행을 읽기 단어 혼다 또는 도요타.나는 같은 XML 파일이

나는 Nokogiri 인 반면, 레일 3. Array#sample은 레일 3에서 자동으로 사용할 수있는 ActiveSupport 3 기능입니다

+1

그것이 오타하지만 닫는 루트 노드가/ – corroded

+0

좋은 캐치 @corroded이없는 것 같아요. 나는 그것을 고쳤다. –

답변

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 

주를 사용하여 페이지 요청에 따라 임의의 행을 표시하는 웹 사이트에 대한이 사용하고 (Gemfile에 추가해야하는) 보석.

Object#try을 사용하면 Array#sample은 배열이 비어 있으면 nil을 반환하므로 XPath 검색과 일치하는 것이 없으면 함수가 여전히 작동합니다 (nil을 반환합니다).

XML 파일이 큰 경우이 작업을 빠르게하려면 상수처럼 자동차 목록을 어딘가에 캐시하십시오. 이것은 모든 파일을 다시로드하지는 않으므로 XML 파일이 변경 될 것으로 예상되는 경우이 작업을 원하지 않을 수 있습니다. 여기

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

def random_car 
    CARS.sample.try(:text) 
end 
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>" 
관련 문제