0

XMLファイルを読み取って特定の子のセットを並べ替えてからディスクに並べ替えて書き戻すことができる簡単なRubyプログラムを作成したいと思います。例えば:

作成したこのXMLファイルから並べ替えたい:

<Nodes>
    <Node1>
        <Name>Fruits</Name>
        <Properties>
            <Property>
                <Name>Orange<Name>
            </Property>
            <Property>
                <Name>Vinegar<Name>
            </Property>
            <Property>
                <Name>Apple<Name>
            </Property>
        </Properties>
    </Node1>
    <Node2>
        <Name>Furniture</Name>
        <Properties>
            <Property>
                <Name>Table</Name>
            </Property>
            <Property>
                <Name>Desk</Name>
            </Property>
            <Property>
                <Name>Bed</Name>
            </Property>
        </Properties>
    </Node2>
</Nodes>

ノードのプロパティの子をアルファベット順に並べ替えたいと思います。

<Property>
    <Name>Apple<Name>
</Property>
<Property>
    <Name>Orange<Name>
</Property>
<Property>
    <Name>Vinegar<Name>
</Property>

Rubyでこれをすばやく行う方法はありますか?

4

1 に答える 1

1

タグの選択からすでにご存知のとおり、選択するツールはノコギリになります。XMLの解析で問題が発生したため、次のように書き直しました。

# sortnodes.xml
<nodes>
  <node1>
    <name>Fruits</name>
    <properties>
      <property>
        <name>Orange</name>
      </property>
      <property>
        <name>Vinegar</name>
      </property>
      <property>
        <name>Apple</name>
      </property>
    </properties>
  </node1>
  <node2>
    <name>Furniture</name>
    <properties>
      <property>
        <name>Table</name>
      </property>
      <property>
        <name>Desk</name>
      </property>
      <property>
        <name>Bed</name>
      </property>
    </properties>
  </node2>
</nodes>

そして、対応するコードは次のとおりです。

require 'nokogiri'

f = File.open("sortnodes.xml")
doc = Nokogiri::XML(f)
f.close
doc.xpath('/nodes//properties').each do |properties| 
  sorted = properties.children.sort_by { |n| n.text }
  sorted.each { |n| properties << n } 
end
于 2012-10-14T01:32:02.220 に答える