Nokogiri-搜索具有特定节点的元素

时间:2014-05-15 05:50:14

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

我有以下示例XML:http://api.clicky.com/api/stats/4?site_id=32020&sitekey=71bf7c1681e22468&type=visitors,countries,searches(虚拟xml数据)

我想指定节点"国家",然后搜索所有"项目"并提取各种数据。我试图这样做:

   xml = Nokogiri::XML(open("http://api.clicky.com/api/stats/4?site_id=32020&sitekey=71bf7c1681e22468&type=visitors,countries,searches"))
        @node = xml.xpath('//countries')
        @countries = @node.search('item').map do |item|
        %w[title value value_percent].each_with_object({}) do |n, o|
          o[n] = item.at(n).text
        end
      end
   end

但这并没有给出任何结果。如果我将xml剥离回http://api.clicky.com/api/stats/4?site_id=32020&sitekey=71bf7c1681e22468&type=visitors并执行:

   xml = Nokogiri::XML(open("http://api.clicky.com/api/stats/4?site_id=32020&sitekey=71bf7c1681e22468&type=countries"))
        @countries = @node.search('item').map do |item|
        %w[title value value_percent].each_with_object({}) do |n, o|
          o[n] = item.at(n).text
        end
      end
   end

这很好用。

我在哪里错了?

1 个答案:

答案 0 :(得分:3)

xpath-query仅匹配名称为“countries”的节点,而不匹配type-attribute设置为“countries”的节点。因此,您需要搜索具有“type”属性且值设置为“countries”

的节点

查找国家/地区所有项目的三种方法

  # (1) Find all nodes with a attribute "type" set to "countries"
  items = xml.xpath("//*[@type='countries']//item") 

  # (2) Find only nodes with name "type" and that has the attribute "type" set to "countries"
  items = xml.xpath("//type[@type='countries']//item") 

  # (3) By using css selectors; find only nodes with name "type" and that has the attribute "type" set to "countries"
  items = xml.css("type[type='countries'] item")