• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何重新排序Ruby中的XML文件

ruby 来源:AKWF 22次浏览

我有一个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”这些元素,我只是无法通过要素弄清楚如何循环。

循环体基本上由简单的嵌套条件组成,其中我测试元素的名称,然后执行特定操作。任何帮助表示赞赏。


===========解决方案如下:

您可以使用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)