Как мне пересортировать XML-файл в Ruby - PullRequest
1 голос
/ 13 декабря 2010

У меня есть метод 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 ]

4 голосов
/ 13 декабря 2010

Вы можете использовать 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 голосов
/ 13 декабря 2010

Я понял:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...