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 .

さまざまなヘルプ ボードで見つけることができるすべてのチュートリアルと回答を見てきましたが、それらはすべて同じことを前提としています。1 つまたは 2 つの特定のタグを検索していて、それらのタグに 1 つまたは 2 つの値が必要なだけです。実際には、各<row>タグに 18 の属性があり、18 の属性ごとに列を持つ mysql テーブルがあります。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 名前空間は無視します)。Nokogiri::XML::NodeSet配列に非常によく似た を返します。

それぞれNokogiri::XML::Elementに、属性に関するすべての情報 (名前、値、名前空間、親要素など) を含むオブジェクトattributesに属性の名前をマッピングするハッシュを返すメソッドがあります。Nokogiri::XML::Attr

于 2013-04-01T20:42:36.207 に答える