1

Tables の下の Table ノードが Name ノードでソートされるように、次の xml ファイルをソートしたいと考えています。また、Columns ノードの下の Columns を Name ノードにします。
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>

提案された回答を試した後、次のコードを試しました。Windows 7 で aptana studio を使用しています。変数docは null ではなく、実際には読み込まれたファイルがありますが、doc.at(//Tables)は 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
4

1 に答える 1

5

ノードを並べ替えるには、必要な順序で親ノードに再挿入します。

tables = doc.at('//Tables')
tables.search('./Table').sort_by{|t| t.at('Name').text}.each do |table|
  tables << table
end
于 2013-03-09T01:53:36.917 に答える