在标签中读取并保存自定义属性

时间:2015-03-16 14:51:52

标签: ruby xml parsing nokogiri

我想用Ruby和Nokogiri解析XML文件,为产品分配类别。 XML文件如下所示:

<cat-assignment cat-id="123" prod-id="456" />
<cat-assignment cat-id="123" prod-id="789" />
<cat-assignment cat-id="123" prod-id="234" /> 
<cat-assignment cat-id="456" prod-id="123" />

等等。

我想为每个cat-id创建一个数组,并在这个数组中存储相应的prod-id。有没有办法这样做?

这样的事情:

parsedXML.each do ...
...
cat_arr = p.xpath("catalog/cat-assignment[@cat-id]")
cat_arr.each do 
  *read all category assignments and create an array for each different cat-id and store the corresponding products within these arrays*
end
end

1 个答案:

答案 0 :(得分:1)

创建一个数据结构,将“cat-ids”与“prod-id”数组相关联,然后找到所有带有“cat-id”的元素,并将“prod-id”附加到相关数组。

例如:

require 'nokogiri'

xml =<<-__HERE__
  <catalog>
    <cat-assignment cat-id="123" prod-id="456" />
    <cat-assignment cat-id="123" prod-id="789" />
    <cat-assignment cat-id="123" prod-id="234" /> 
    <cat-assignment cat-id="456" prod-id="123" />
  </catalog>
  __HERE__

cat_prods = Hash.new { |h,k| h[k] = Array.new }
doc = Nokogiri::XML(xml)
doc.xpath('//*[@cat-id][@prod-id]').each do |el|
  cat_prods[el['cat-id']] << el['prod-id']
end
cat_prods # => {"123"=>["456", "789", "234"], "456"=>["123"]}