给定以下XML示例。
<Widgets>
<Widget>
<Price>29</Price>
<DateAdded>02/05/2015</DateAdded>
</Widget>
</Widgets>
我正在努力查找过去7天内添加的所有小部件。
我尝试了以下方法:
widgets.xpath("//Widget[DateAdded[text()>"#{7.days.ago}"]]")
却得不到爱。试图变得聪明并做到了:
widgets.xpath("//Widget[(DateAdded[DateTime.parse(text())>"#{7.days.ago}"]]")
但无济于事(这并不奇怪,因为这是一个很长的机会!)。
我真的很想避免遍历整个小工具列表,并对每个小工具进行日期比较。
关于如何实现这一点,有什么想法吗?
谢谢。
考虑一下:
require 'nokogiri'
require 'date'
module WidgetDate
def date_added
string = xpath(".//DateAdded").text
format = "%m/%d/%Y"
Date.strptime(string, format)
end
def added_within_a_week?
(0..7).include? (Date.today - date_added)
end
end
xml = Nokogiri::XML.parse DATA.read
widgets = xml.xpath(".//Widget").map { |widget| widget.extend WidgetDate }
result = widgets.select { |widget| widget.added_within_a_week? }
__END__
<Widgets>
<Widget>
<Price>16</Price>
<DateAdded>02/11/2015</DateAdded>
</Widget>
<Widget>
<Price>18</Price>
<DateAdded>02/15/2015</DateAdded>
</Widget>
<Widget>
<Price>29</Price>
<DateAdded>02/08/2015</DateAdded>
</Widget>
<Widget>
<Price>9</Price>
<DateAdded>01/27/2015</DateAdded>
</Widget>
<Widget>
<Price>36</Price>
<DateAdded>01/03/2015</DateAdded>
</Widget>
</Widgets>
解释:
module
WidgetDate定义了启用已解析小部件功能的方法,这些功能对过滤它们很有用extend
用于将模块中定义的方法混合到每个小部件