2015-02-08 33 views
1

給出以下XML示例。Ruby + Nokogiri - 如何按日期過濾存儲在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}\"]]") 

無濟於事(毫不奇怪,因爲這是一個長鏡頭!)。

我真的很想避免遍歷整個Widgets列表並對每個列表進行日期比較。

有關如何使這件事發生的任何想法?

謝謝。

回答

1

考慮一下:

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用於混合模塊中定義的方法給每個小部件。
+1

Jikku,你是男人!這工作完美。我今天學了些新東西。謝謝! – Rick 2015-02-13 00:56:21

+0

@Rick我也是這樣從這裏學習的,來自很多有幫助的人,在你學習的時候記得幫助:) ..祝你有個美好的一天 – 2015-02-13 02:45:41