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

Ruby 如何使用Nokogiri::XML分别获取属性和值?,ruby,xml,xpath,nokogiri,Ruby,Xml,Xpath,Nokogiri,我有以下XML,在同一行中有两个数据ID和产品描述,例如,对于A4纸张,ID=18863;对于电视,ID=18858……) 多谢各位 @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

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

多谢各位

@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 
这里有更多示例-

返回内容和属性的散列 实现这一点的方法不止一种,但我发现最直观的方法是返回每个节点的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
您可能想使用
p.content.strip
删除每个产品的尾随空格,但这超出了原始问题的范围

注意:上述方法在Ruby 2.1.0和IRB控制台上运行良好。您的里程数可能因其他Ruby版本或Pry而异。

@doc=@doc.xpath(“.//products/product”)
用节点列表覆盖@doc。那可能不是你想要的。
18863 paper A4 
18858 TV Smart 12 
18857 KitKat 
8816 Pen 
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
{"18863"=>"paper A4 ",
 "18858"=>"TV Smart 12 ",
 "18857"=>"KitKat ",
 "8816"=>"Pen "}