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