2011-11-01 4 views
0

시작하려면 Ruby on Rails를 처음 사용했습니다.XML을 레일에서 해시하는 더 좋은 방법은 무엇입니까?

그래서 각 큐브의 "currency"속성이 키이고 "rate"가 값이되도록 this XML file에서 해시로 데이터를 가져 오려고합니다. ,

xml = open("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml") 
doc = Document.new(xml) 

a = [] 
b = [] 

doc.elements.each("//Cube") do |element| 
    a << element.attributes["currency"] 
    b << element.attributes["rate"] 
end 
currency_rates = {} 
a.each_with_index {|k,i|currency_rates[k] = b[i]} 

이 코드는 작동합니다

{"Envelope"=>{"Cube"=>{"Cube"=>{"Cube"=>[{"rate"=>"1.3627", "currency"=>"USD"}, {"rate"=>"106.58", "currency"=>"JPY"}, {"rate"=>"1.9558", "currency"=>"BGN"}, {"rate"=>"25.030", "currency"=>"CZK"}, {"rate"=>"7.4414", "currency"=>"DKK"}, {"rate"=>"0.85515", "currency"=>"GBP"}, {"rate"=>"309.48", 
"currency"=>"HUF"}, {"rate"=>"3.4528", "currency"=>"LTL"}, {"rate"=>"0.7037", "currency"=>"LVL"}, {"rate"=>"4.4774", "currency"=>"PLN"}, {"rate"=>"4.3528", "currency"=>"RON"}, {"rate"=>"9.0625", "currency"=>"SEK"}, {"rate"=>"1.2174", "currency"=>"CHF"}, {"rate"=>"7.7580", "currency"=>"NOK"}, {"r 
ate"=>"7.5010", "currency"=>"HRK"}, {"rate"=>"42.1400", "currency"=>"RUB"}, {"rate"=>"2.4508", "currency"=>"TRY"}, {"rate"=>"1.3237", "currency"=>"AUD"}, {"rate"=>"2.3945", "currency"=>"BRL"}, {"rate"=>"1.3855", "currency"=>"CAD"}, {"rate"=>"8.6613", "currency"=>"CNY"}, {"rate"=>"10.5920", "curre 
ncy"=>"HKD"}, {"rate"=>"12121.45", "currency"=>"IDR"}, {"rate"=>"5.0177", "currency"=>"ILS"}, {"rate"=>"67.1540", "currency"=>"INR"}, {"rate"=>"1529.33", "currency"=>"KRW"}, {"rate"=>"18.6867", "currency"=>"MXN"}, {"rate"=>"4.2525", "currency"=>"MYR"}, {"rate"=>"1.7152", "currency"=>"NZD"}, {"rat 
e"=>"58.289", "currency"=>"PHP"}, {"rate"=>"1.7402", "currency"=>"SGD"}, {"rate"=>"42.162", "currency"=>"THB"}, {"rate"=>"11.1484", "currency"=>"ZAR"}], "time"=>"2011-11-01"}}, "subject"=>"Reference rates", "xmlns:gesmes"=>"http://www.gesmes.org/xml/2002-08-01", "Sender"=>{"name"=>"European Centr 
al Bank"}, "xmlns"=>"http://www.ecb.int/vocabulary/2002-08-01/eurofxref"}} 

그래서 내가 REXML을 사용하여 종료 :

먼저 나는 나에게 열심히조차이 작업을보고 다음을 가지고있는 Hash.from_xml를 사용하여 시도 나는 내가 찾고있는 최종 결과를 얻는다. 하지만 나에게 이것이 두 개의 분리 된 배열을 생성하고 나서 함께 결합하는 것처럼 복잡한 것처럼 보입니다. 더 좋은 방법이 있나요? 배열이없는 블록에서 해시를 만드는 방법이 있습니까?

아니면 내 블록 전에 할 수있는 더 나은 XML 쿼리가 있습니까? XPath에 관해서는 거의 알지 못합니다.

+0

체크 아웃 https://github.com/jnunemaker/crack을 당신은 알고 –

답변

0

당신이 두 개의 중간 배열하지 않고 직접 해시를 채울 수있는 두 번째 예제를 사용 :

xml = open("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml") 
doc = Document.new(xml) 

currency_rates = {} 

doc.elements.each("//Cube") do |element| 
    currency_rates[element.attributes["currency"]] = element.attributes["rate"] 
end 
+0

, 나는이 솔루션을 시도 맹세합니다. 하지만 분명히 그렇지 않거나, 잘못 했어요. 왜냐하면 이것이 제가하고 싶은 일을 정확하게 수행했기 때문입니다. 감사! – nick

관련 문제