【问题标题】:Cherry pick XML nodes in specific order using NokogiriCherry 使用 Nokogiri 按特定顺序挑选 XML 节点
【发布时间】:2019-01-27 17:30:24
【问题描述】:

我需要按特定顺序(橙、苹果、樱桃)导入水果节点,而不是按字母或数字:

<fruits>
  <fruit>
    <name>Apple</name>
    <expiration>2018-08-21</expiration>
  </fruit>
  <fruit>
    <name>Banana</name>
    <expiration>2018-08-29</expiration>
  </fruit>
  <fruit>
    <name>Cherry</name>
    <expiration>2018-08-29</expiration>
  </fruit>
  <fruit>
    <name>Orange</name>
    <expiration>2018-08-20</expiration>
  </fruit>
</fruits>

在新的排序要求之前,我们这样枚举节点,效果很好:

doc.css('fruit').each do |fruit|
  Pantry.create({name:fruit.css('name').first.text,
                 expiration: fruit.css('expiration').text})
end

我尝试使用基于this answerxpath,但它只返回name 子节点,而不是父fruit 节点,导致expiration 子节点不可访问:

fruit_basket = %w[Orange Apple Cherry]
fruit_basket.each do |temp_fruit|  
  fruit = doc.xpath("//name[contains(text(), '#{temp_fruit}')]")
  Pantry.create({name:fruit.css('name').text,
                 expiration: fruit.css('expiration').text})
end

按照我的fruit_basket 数组的顺序枚举水果节点的正确方法是什么(nokogiri-way?),忽略不在fruit_basket 中的水果节点?

【问题讨论】:

    标签: ruby xml ruby-on-rails-4 xpath nokogiri


    【解决方案1】:

    Nokogiri 返回一个Enumerable,您可以根据需要对其进行排序:

    fruit_basket = %w[Orange Apple Cherry]
    
    doc.
      xpath('//fruit').
      sort_by do |e| # HERE
        fruit_basket.index(e.xpath('name').text) || Float::INFINITY
      end.
      each { |e| puts e.text }
    
    #⇒ Orange
    #  2018-08-20
    #  Apple
    #  2018-08-21
    #  Cherry
    #  2018-08-29
    #  Banana
    #  2018-08-29
    

    是否需要跳过未列出的水果,提前过滤:

    doc.
      xpath('//fruit').
      select do |e| # HERE
        fruit_basket.index(e.xpath('name').text)
      end.
      sort_by do |e|
        fruit_basket.index(e.xpath('name').text)
      end.
      each { |e| puts e.text }
    

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多