我正在处理像这样的xml:
<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
但我得到
TypeError(符号作为数组索引):
在这一行:
while (@flight = @flight_groups[:flight_details])
为什么我的哈希变成一个数组?这是迭代原始哈希的正确方法吗?
谢谢!!!
答案 0 :(得分:10)
答案 1 :(得分: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 mangler可能将该列表转换为列表的最自然表示,这将为您提供Array的实例而不是哈希。
您不希望将@flights
作为哈希进行迭代,而是将其作为数组进行迭代。您可能会遇到内部<flight_details>
元素的相同情况。