【发布时间】:2011-05-08 05:49:33
【问题描述】:
如何在 Ruby 中将 XML 正文转换为哈希?
我有一个 XML 正文,我想将其解析为哈希
<soap:Body>
<TimesInMyDAY>
<TIME_DATA>
<StartTime>2010-11-10T09:00:00</StartTime>
<EndTime>2010-11-10T09:20:00</EndTime>
</TIME_DATA>
<TIME_DATA>
<StartTime>2010-11-10T09:20:00</StartTime>
<EndTime>2010-11-10T09:40:00</EndTime>
</TIME_DATA>
<TIME_DATA>
<StartTime>2010-11-10T09:40:00</StartTime>
<EndTime>2010-11-10T10:00:00</EndTime>
</TIME_DATA>
<TIME_DATA>
<StartTime>2010-11-10T10:00:00</StartTime>
<EndTime>2010-11-10T10:20:00</EndTime>
</TIME_DATA>
<TIME_DATA>
<StartTime>2010-11-10T10:40:00</StartTime>
<EndTime>2010-11-10T11:00:00</EndTime>
</TIME_DATA>
</TimesInMyDAY>
</soap:Body>
我想把它转换成这样的哈希:
{ :times_in_my_day => {
:time_data = > [
{:start_time=>"2010-11-10T09:00:00", :end_time => "2010-11-10T09:20:00" },
{:start_time=>"2010-11-10T09:20:00", :end_time => "2010-11-10T09:40:00" },
{:start_time=>"2010-11-10T09:40:00", :end_time => "2010-11-10T10:00:00" },
{:start_time=>"2010-11-10T10:00:00", :end_time => "2010-11-10T10:20:00" },
{:start_time=>"2010-11-10T10:40:00", :end_time => "2010-11-10T11:00:00" }
]
}
}
理想情况下,标签将转换为snake_case 符号并成为散列中的键。
此外,日期时间缺少其时区偏移量。它们位于本地时区(不是 UTC)。所以我想解析它以显示本地偏移量,然后将 xml 日期时间字符串转换为 Rails DateTime 对象。结果数组将类似于:
{ :times_in_my_day => {
:time_data = > [
{:start_time=>Wed Nov 10 09:00:00 -0800 2010, :end_time => Wed Nov 10 9:20:00 -0800 2010 },
{:start_time=>Wed Nov 10 09:20:00 -0800 2010, :end_time => Wed Nov 10 9:40:00 -0800 2010 },
{:start_time=>Wed Nov 10 09:40:00 -0800 2010, :end_time => Wed Nov 10 10:00:00 -0800 2010 },
{:start_time=>Wed Nov 10 10:00:00 -0800 2010, :end_time => Wed Nov 10 10:20:00 -0800 2010 },
{:start_time=>Wed Nov 10 10:40:00 -0800 2010, :end_time => Wed Nov 10 11:00:00 -0800 2010 }
]
}
}
我能够以这种方式使用parse 和in_time_zone 方法转换单个日期时间:
Time.parse(xml_datetime).in_time_zone(current_user.time_zone)
但我不太确定在将 XML 转换为哈希时解析时间的最佳方法。
如果有任何建议,我将不胜感激。谢谢!
编辑
将日期时间字符串转换为 Rails DateTime 对象的代码错误。这会将 xml 日期时间字符串解析为系统的时区偏移量,然后将该时间转换为用户的时区。正确的代码是:
Time.zone.parse(xml_datetime)
如果用户的时区与系统不同,这会将用户的时区偏移量添加到原始日期时间字符串中。这里有一个关于如何启用用户时区偏好的 Railscast:http://railscasts.com/episodes/106-time-zones-in-rails-2-1。
【问题讨论】:
-
Time.zone.parse(xml_datetime)
标签: ruby-on-rails xml datetime hash