2011-07-01 41 views
0

我處理這樣一個xml:如何遍歷一個哈希在Ruby中

<fare_master_pricer_reply> 
<flight_index> 

    <group_of_flights> 
    <flight_details> 
    </flight_details> 
    . 
    . 
    <flight_details> 
    </flight_details> 
    </group_of_flights> 

    <group_of_flights> 
    <flight_details> 
    </flight_details> 
    . 
    . 
    <flight_details> 
    </flight_details> 
    </group_of_flights> 
    .  
    . 
    <group_of_flights> 
    <flight_details> 
    </flight_details> 
    . 
    . 
    <flight_details> 
    </flight_details> 
    </group_of_flights> 
    </flight_index> 
</fare_master_pricer_reply> 

這是給我的一個哈希對象。我需要遍歷散列,到目前爲止,我編寫這樣的:

@flights = response.to_hash[:fare_master_pricer_calendar_reply][:flight_index] 
while (@flight_groups = @flights[:group_of_flights]) != nil 
    while (@flight = @flight_groups[:flight_details]) 
    @time_data = @flight[:flight_information][:product_date_time] 
    @html = "<tr>" 
    @html += "<td>" + @time_data[:date_of_departure] + "</td>" 
    @html += "<td>" + @time_data[:date_of_arrival] + "</td>" 
    @html += "<td>" + @flight[:location][:location_id] + "</td>" 
    @html += "</tr>" 
    end 
    @html = "<tr><td>**</td><td>**</td><td>**</td><td>**</td><td>**</td><td>**</td><td>**</td></td>" 
end 

,但我得到

類型錯誤(符號作爲數組索引):

在這一行

while (@flight = @flight_groups[:flight_details]) 

爲什麼我的散列成爲一個數組?這是迭代我的原始散列的正確方法嗎?

謝謝!!!

回答

3

有一個在你的XML:

<fare_master_pricer_reply> 
<flight_index> 
    <group_of_flights> 
    <!--...--> 
    </group_of_flights> 
    <group_of_flights> 
    <!--...--> 
    </group_of_flights> 
    <group_of_flights> 
    <!--...--> 
    </group_of_flights> 
    <!--...--> 

所以<flight_index>包含<group_of_flights>元素的列表。這自然會被表示爲一個數組,而不是一個散列。

然後,你這樣做:

@flights = response.to_hash[:fare_master_pricer_calendar_reply][:flight_index] 

這是相同的:

h = response.to_hash 
@flights = [:fare_master_pricer_calendar_reply][:flight_index] 

所以@flights<flight_index>內容結束。如上所述,<flight_index>只是一個包含<group_of_flights>元素列表的容器,您的XML修改器可能會將該列表轉換爲列表的最自然表示形式,這會給您一個Array而非哈希的實例。

你不想迭代@flights作爲散列,而是將其作爲一個Array迭代。您可能會遇到與內部<flight_details>元素相同的情況。

+0

而我該如何迭代該數組?因爲我需要知道「關鍵」值才能做我想做的事(即構建一個代表我的xml數據的表) – content01

+0

@ content01:可能是'''''''''''''' ...},這會給你'g'中的''數據,然後是另一個'g.each'來獲取包含的<等。 –

+0

事情是,在每個< group_of_flights>存在比更多的標籤。如何獲得外部循環內的? – content01

9

遍歷哈希正確的方法是,像這樣

@flights.each do |key, value| 
end 

Hash#each