2013-03-08 25 views
1

我要排序的下面的XML文件,例如,根據表的表節點由 其名稱節點進行排序XML文件。我也希望列節點下的列成爲它們的名稱節點。
我怎樣才能做到這一點使用紅寶石和引入nokogiri?需要幫助的分揀使用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工作室在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 2013-03-09 23:32:33

+1

我注意到有你的XML問題。解決這些,它會工作。 – pguardiario 2013-03-10 00:19:01

+0

我沒有和我能夠表進行排序。我注意到THA當我試圖爲列做這些時,我只能得到第一個表的列已排序。我更新了代碼以嘗試對列進行排序。 – Flethuseo 2013-03-10 00:33:09