Ruby + Nokogiri - 如何按 XML 元素中存储的日期进行过滤?
Ruby + Nokogiri - How to filter by date stored within XML element?
给定以下 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
用于混合模块中定义的方法到每个widgets。
给定以下 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
用于混合模块中定义的方法到每个widgets。