2013-04-01 33 views
0

元素我試圖解析文件,並得到所有屬性的文件中的每個<row>標籤的所有屬性。該文件看起來一般是這樣的:獲得在XML文件

<?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表,每個屬性有一列。我需要把這些信息放到一個可以用ActiveRecord/Ruby插入表的對象/散列/數組中。

我開始使用的角度來說,Hpricot;你可以在這個問題的編輯歷史中看到代碼(這是不相關的)。

+0

不要使用的信息的對象Nokogiri::XML::Attr指向您的XML的鏈接。 *當*鏈接打破你的問題將是相當毫無價值的未來搜索相同的問題。相反,嵌入顯示問題所需的最小XML。此外,使用鏈接會迫使我們追查解決問題所需的材料。我們沒有得到報酬,我們是志願者,而且通過假設我們會這樣做而浪費時間,所以請給我們我們需要的幫助。 –

+1

此外,您的標籤和標題以及問題文字都說Nokogiri,但您的來源僅適用於Hpricot。你有沒有嘗試過使用Nokogiri?如果是這樣,代碼在哪裏?我希望你不要指望有人會爲你編寫/移植代碼。同樣,你需要給我們提供幫助你的信息。 –

+0

我是新來的網絡刮,不幸的是,我意識到,IM通過一本書,是過時的(紅寶石實踐報告和軌道第13章)工作,動輒我運行到代碼示例,不工作。我在irb中使用Nokogiri,不幸的是昨天經過12個小時的挫折之後,我關閉了我的電腦,並且所有的nokogiri代碼都沒有了。我試圖重新創建它,並重新回到之前我發佈的位置。謝謝你的教訓,我浪費大家的時間...... –

回答

1
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方法,它返回一個散列映射屬性的名稱包含所有有關屬性(名稱,值,命名空間,父元素,等等)

+0

你是絕對的救星!非常感謝你幫助我看到一個實際可行的例子!它絕對幫助我克服了挫折感,我可以重新學習,我欠你一大時間! (兩個例子都完美無缺地工作) –