如何使用Nokogiri :: XML分别获取属性和值?

时间:2014-02-22 12:56:58

标签: ruby xml xpath nokogiri

我有以下XML,ID和产品描述在同一行中有两个数据,例如,纸张A4的ID = 18863,电视的ID = 18858 ......)

<products>
<product id="18863">paper A4 </product>
<product id="18858">TV Smart 12 </product>
<product id="18857">KitKat </product>
<product id="8816">Pen </product>
</products>

如何获取ID和说明(A4纸,TV Smart 12 ......)?

@doc = Nokogiri::XML(open("http://url/file.xml"))
@doc = @doc.xpath(".//products/product")

谢谢

2 个答案:

答案 0 :(得分:1)

返回内容和属性的哈希

有多种方法可以做到这一点,但我发现最直观的方法是返回每个节点的ID和内容的哈希值。例如:

require 'nokogiri'
@doc = Nokogiri::XML <<'EOF'
         <products>
           <product id="18863">paper A4 </product>
           <product id="18858">TV Smart 12 </product>
           <product id="18857">KitKat </product>
           <product id="8816">Pen </product>
         </products>
EOF
@doc.xpath('//products/product').
     map { |p| [p.attribute('id').value, p.content] }.to_h

这将返回一个哈希值,其中每个ID都是键,产品名称是值。例如,上面的代码返回:

{"18863"=>"paper A4 ",
 "18858"=>"TV Smart 12 ",
 "18857"=>"KitKat ",
 "8816"=>"Pen "}

您可能希望使用p.content.strip删除每个产品的尾随空格,但这超出了原始问题的范围。

注意:以上内容适用于Ruby 2.1.0和IRB控制台。您的里程可能因其他Ruby版本或Pry而异。

答案 1 :(得分:0)

@doc = Nokogiri::HTML(open('/test.html'))
@doc.xpath('//products/product').each do |p|
       puts "#{p['id']} #{p.content}"
end

结果:

18863 paper A4 
18858 TV Smart 12 
18857 KitKat 
8816 Pen 

此处有更多示例 - http://nokogiri.org/Nokogiri/XML/Node.html