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

时间:2010-12-13 14:06: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”上对这些元素进行重新排序,我无法弄清楚如何遍历元素。

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

2 个答案:

答案 0 :(得分: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') }

答案 1 :(得分:-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