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>

解释:

  1. module WidgetDate 定义了启用解析的小部件功能的方法,这些功能可用于过滤它们。
  2. extend用于混合模块中定义的方法到每个widgets。