Ruby+Nokogiri-如何根据XML元素中存储的日期进行筛选



给定以下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. moduleWidgetDate定义了启用已解析小部件功能的方法,这些功能对过滤它们很有用
  2. extend用于将模块中定义的方法混合到每个小部件

相关内容

  • 没有找到相关文章

最新更新