Nokogiri XML 查询

Nokogiri XML query

<XML>
  <EVENT>
    <SHOPS>
      <SHOP shopid="0001" name="London" city="LONDON"/>
    </SHOPS>
    <HISTORY>
      <WIN shopid="0001" amount="2000" time="2015-03-28 19:09:23"/>
    </HISTORY>
  </EVENT>
</XML>

如何在 xml 文件中编写此 Nokogiri 查询?

  1. 遍历xml文件,找到属性数量>900的节点
  2. 获取该节点的属性shopid
  3. 获取金额 > 900 的 shopid 的名称和城市

这是一个 'the long way' 的示例,使用大量 Ruby 并在文档中走动:

require 'nokogiri'
doc = Nokogiri.XML( File.read('my.xml') )

wins = doc.search('WIN')
wins_with_amount = wins.select{ |win| win['amount'] }
first_big = wins_with_amount.find{ |win| win['amount'].to_i > 900 }
shop_id   = first_big['shopid']
shop      = doc.search('SHOP').find{ |shop| shop['shopid']==shop_id }
puts shop['name'], shop['city']

快速方法,仅使用 XPath:

require 'nokogiri'
doc = Nokogiri.XML( File.read('my.xml') )

shop = doc.at('//SHOP[@shopid=//WIN[@amount>900]/@shopid]')
puts shop['name'], shop['city']

解释该 XPath 查询:

  • //SHOP - 查找所有 SHOP 元素
    • [@shopid=...] ... shopid 属性符合此条件
    • //WIN - 查找所有 WIN 元素
      • [@amount>900] ...有一个 amount 属性值大于 900
        • /@shopid ...找到这些WIN元素的shopid属性。