我正在尝试解析文件并获取文件中每个<row>
标记的所有属性。该文件看起来像这样:
<?xml version="1.0" standalone="yes"?>
<report>
<table>
<columns>
<column name="month"/>
<column name="campaign"/>
<!-- many columns -->
</columns>
<rows>
<row month="December 2009" campaign="Campaign #1"
adgroup="Python" preview="Not available"
headline="We Write Apps in Python"
and="many more attributes here" />
<row month="December 2009" campaign="Campaign #1"
adgroup="Ruby" preview="Not available"
headline="We Write Apps in Ruby"
and="many more attributes here" />
<!-- many such rows -->
</rows></table></report>
以下是完整档案:http://pastie.org/7268456#2。
我已经查看了我可以在各种帮助板上找到的每个教程和答案,但他们都假设相同的事情 - 我正在搜索一个或两个特定标签,只需要这些标签的一个或两个值。我实际上每个<row>
标签有18个属性,我有一个mysql表,每个18个属性都有一列。我需要将信息放入一个对象/哈希/数组中,我可以使用它来插入带有ActiveRecord / Ruby的表。
我开始使用Hpricot;你可以在这个问题的编辑历史中看到代码(不相关)。
答案 0 :(得分:2)
require 'nokogiri'
doc = Nokogiri.XML(my_xml_string)
doc.css('row').each do |row|
# row is a Nokogiri::XML::Element
row.attributes.each do |name,attr|
# name is a string
# attr is a Nokogiri::XML::Attr
p name => attr.value
end
end
#=> {"month"=>"December 2009"}
#=> {"campaign"=>"Campaign #1"}
#=> {"adgroup"=>"Python"}
#=> {"preview"=>"Not available"}
#=> {"headline"=>"We Write Apps in Python"}
#=> etc.
或者,如果您只想要一个哈希数组,将属性名称映射到字符串值:
rows = doc.css('row').map{ |row| Hash[ row.attributes.map{|n,a| [n,a.value]} ] }
#=> [
#=> {"month"=>"December 2009", "campaign"=>"Campaign #1", adgroup="Python", … },
#=> {"month"=>"December 2009", "campaign"=>"Campaign #1", adgroup="Ruby", … },
#=> …
#=> ]
Nokogiri.XML
方法是解析XML字符串并获得Nokogiri::Document
的最简单方法。
css
方法是查找具有给定名称的所有元素的最简单方法(忽略其包含层次结构和任何XML名称空间)。它返回Nokogiri::XML::NodeSet
,这与数组非常相似。
每个Nokogiri::XML::Element
都有一个attributes
方法,该方法将属性名称的哈希映射返回到Nokogiri::XML::Attr
对象,该对象包含有关该属性的所有信息(名称,值,名称空间,父级)元素等。)