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 查询?
- 遍历xml文件,找到属性数量>900的节点
- 获取该节点的属性shopid
- 获取金额 > 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
属性。
<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 查询?
- 遍历xml文件,找到属性数量>900的节点
- 获取该节点的属性shopid
- 获取金额 > 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
属性。