0

我正在尝试解析文件并获取文件中每个<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;您可以在此问题的编辑历史记录中看到代码(不相关)。

4

1 回答 1

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 名称空间)。它返回 a Nokogiri::XML::NodeSet,它与数组非常相似。

每个方法Nokogiri::XML::Element都有一个attributes方法,该方法返回一个哈希值,将属性名称映射到Nokogiri::XML::Attr包含有关属性的所有信息(名称、值、命名空间、父元素等)的对象。

于 2013-04-01T20:42:36.207 回答