我有以下示例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
这很好用。
我在哪里错了?
答案 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")