2010-12-13 1143 views
1

我有一個ruby方法來執行復雜的數據收集並將信息放在一個XML文件中。但是,我需要添加一個後處理步驟,根據特定元素的文本值對結果進行重新排序。如何重新排序Ruby中的XML文件

我已經構建了循環並將信息添加到哈希以允許我這樣做。我難以理解的是如何循環元素。我在REXML和XML庫中嘗試過一些例子,但都無濟於事。

我的XML文件的結構是這樣的:

<?xml version="1.0"?> 
<Data> 
    <Apps> 
    <Master> 
     <VehicleType>Tractor</VehicleType> 
     <Make>International</Make> 
     <Sub> 
     <Model>Model 1600</Model> 
     <Years>2003</Years> 
     <Breakout1>Green</Breakout1> 
     <Part1_PartType>Seat</Part1_PartType> 
     <Part1>440K3</Part1> 
    </Sub> 
     <Sub> 
     <Model>Model 1600</Model> 
     <Years>2003</Years> 
     <Breakout1>Blue</Breakout1> 
     <Part1_PartType>Seat</Part1_PartType> 
     <Part1>ABC87S</Part1> 
    </Sub> 
     <Sub> 
     <Model>Model 1600</Model> 
     <Years>2003</Years> 
     <Breakout1>Green</Breakout1> 
     <Part1_PartType>Seat</Part1_PartType> 
     <Part1>440K4</Part1> 
    </Sub> 
    </Master> 
</Apps> 
</Data> 

我需要重新排序的「Breakout1」這些元素,我只是無法通過要素弄清楚如何循環。

循環體基本上由簡單的嵌套條件組成,其中我測試元素的名稱,然後執行特定操作。任何幫助表示讚賞。

+0

爲什麼你不把你的數據*在寫入到XML之前排序? – 2010-12-13 14:58:20

+0

或者從XML中提取數據但在應用程序中使用它之前進行排序?我將XML視爲在應用程序之間傳輸數據的一種方式,但我不指望它正確排序,除非我擁有連接的兩端。 – 2010-12-13 15:28:36

回答

4

您可以使用each_element來搜索通過在REXML或get_elements元素循環返回數組。兩者都採用xpath表達式來縮小元素的範圍。這是你需要什麼嗎?:

require "rexml/document" 

XML = '<Data> 
    <Apps> 
    <Master> 
     <VehicleType>Tractor</VehicleType> 
     <Make>International</Make> 
     <Sub> 
     <Model>Model 1600</Model> 
     <Years>2003</Years> 
     <Breakout1>Green</Breakout1> 
     <Part1_PartType>Seat</Part1_PartType> 
     <Part1>440K3</Part1> 
    </Sub> 
     <Sub> 
     <Model>Model 1600</Model> 
     <Years>2003</Years> 
     <Breakout1>Blue</Breakout1> 
     <Part1_PartType>Seat</Part1_PartType> 
     <Part1>ABC87S</Part1> 
    </Sub> 
     <Sub> 
     <Model>Model 1600</Model> 
     <Years>2003</Years> 
     <Breakout1>Green</Breakout1> 
     <Part1_PartType>Seat</Part1_PartType> 
     <Part1>440K4</Part1> 
    </Sub> 
    </Master> 
</Apps> 
</Data>' 

doc = REXML::Document.new XML 
doc.root.each_element('//Sub') { |sub| puts sub.get_text('Breakout1') } 
sorted = doc.root.get_elements('//Sub').sort { |s1, s2| s1.get_text('Breakout1') <=> s2.get_text('Breakout1') } 
+0

非常感謝史蒂夫! – AKWF 2010-12-13 20:21:42

-1

我這是怎麼回事:

# extract event information 
xml = Nokogiri::XML File.open filename 
xml.xpath('//Master').each do |elem| 

    for ele in elem.elements 
    # my sorting stuff here 
    end 

end