2013-03-08 4 views
1

Я хочу отсортировать следующий XML-файл таким образом, чтобы узлы таблицы под таблицами сортировались по их имени. Я также хочу, чтобы столбцы под узлом Столбцы были их узлом имени.
Как это сделать с помощью ruby ​​и nokogiri?нужна помощь в сортировке xml-файла с помощью ruby ​​nokogiri

Я надеюсь, что этот пример дает представление о том, как я хочу отсортированный (он не включает весь файл, слишком много набрав):

.... 
      <Table> 
      <Name>Account</Name> 
      ... 
      </Table> 
      <Table> 
      <Name>Item</Name> 
      </Table> 
      <Name>Order</Name> 
      <Table> 
      <Name>Product</Name> 
      ... 
       <Column> 
        <Name>description</Name> 
       </Column> 
       <Column> 
        <Name>productid</Name> 
       </Column> 
       <Column> 
        <Name>productname</Name> 
       </Column> 
      ... 
      </Table> 
    .... 

К сожалению, я не могу загрузить файл неупорядоченной. Поэтому я должен буду опубликовать его здесь:

<Db xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tedsdb.com/schemas" xsi:schemaLocation="http://tedsdb.com/schemas/Db.xsd"> 
     <Name>Store</Name> 
     <Version>3</Version> 
     <Catalog name="Store" version="3"></Catalog> 
     <Tables> 
     <Table> 
      <Name>Product</Name> 
      <Columns> 
       <Column> 
        <Name>productid</Name> 
        <Length>11</Length> 
       </Column> 
       <Column> 
        <Name>productname</Name> 
        <Length>25</Length> 
       </Column> 
       <Column> 
        <Name>description</Name> 
        <Length>250</Length> 
        <Properties> 
        <Property> 
         <Name>Store_NAME</Name> 
         <Value>desc</Value> 
        </Property> 
        </Properties> 
       </Column> 
      </Columns> 
     </Table> 
     <Table> 
      <Name>Order</Name> 
      <Columns> 
       <Column> 
        <Name>orderid</Name> 
        <Length>11</Length> 
       </Column> 
       <Column> 
        <Name>userid</Name> 
        <Length>11</Length> 
       </Column> 
       <Column> 
        <Name>orderdate</Name> 
        <Properties> 
        <Property> 
         <Name>NAME_IS_KEYWORD</Name> 
         <Value>desc_</Value> 
        </Property> 
        <Property> 
         <Name>Store_NAME</Name> 
         <Value>desc</Value> 
        </Property> 
        </Properties> 
       </Column> 
      </Columns> 
      <Key> 
       <Name>Order_PK</Name> 
       <Type>PRIMARY</Type> 
       <ColumnNames> 
        <Name>topid</Name> 
       </ColumnNames> 
      </Key> 
     </Table> 
     <Table> 
      <Name>Item</Name> 
      <Columns> 
       <Column> 
        <Name>itemid</Name> 
        <Length>11</Length> 
       </Column> 
       <Column> 
        <Name>itemname</Name> 
        <Length>250</Length> 
       </Column> 
      </Columns> 
      <Key> 
       <Name>Product_PK</Name> 
       <Type>PRIMARY</Type> 
       <ColumnNames> 
        <Name>topid</Name> 
       </ColumnNames> 
      </Key> 
     </Table> 
     <Table> 
      <Name>Account</Name> 
      <Columns> 
       <Column> 
        <Name>accountid</Name> 
        <Length>11</Length> 
       </Column> 
       <Column> 
        <Name>accountname</Name> 
        <Length>250</Length> 
       </Column> 
      </Columns> 
      <Key> 
       <Name>Product_PK</Name> 
       <Type>PRIMARY</Type> 
       <ColumnNames> 
        <Name>topid</Name> 
       </ColumnNames> 
      </Key> 
     </Table> 
     </Tables> 
     <Links> 
     <Link> 
      <Name>Accounts.orders.link</Name> 
     </Link> 
     </Links> 
    </Db> 

После того, как вы попробовали ответить, я попробовал следующий код. Я использую Aptana Studio на Windows 7. Переменная DOC не равно нулю и на самом деле имеет загруженный файл, но doc.at (// Таблицы) возвращает NIL, и поэтому он не оттуда:

require "rubygems" 
require "nokogiri" 

f = File.open("test.xml") 
doc = Nokogiri::XML(f) 
f.close 

tables = doc.at('//Tables'); 

tables.search('./Table').each do |t| 
    columns = t.at('//Columns') 
    columns.search('./Column').sort_by { |l| l.at('Name').text }.each do |col| 
    columns << col 
    end 
end 

puts doc.to_xml 

ответ

5

Для сортировки узлов просто вставьте их в родительском узел в порядке, вы хотите их:

tables = doc.at('//Tables') 
tables.search('./Table').sort_by{|t| t.at('Name').text}.each do |table| 
    tables << table 
end 
+0

не работает:. (... вложенные коды в вопросе – Flethuseo

+1

я заметил, есть проблемы с вашим XML Исправьте их, и он будет работать. – pguardiario

+0

Я сделал, и мне удалось сортировать таблицы. Я заметил, что t, когда я попытался сделать это для столбцов. Я получаю только сортировку столбцов первой таблицы. Я обновил код до попытки сортировки столбцов. – Flethuseo

Смежные вопросы