如何读取XML文件,对其进行排序,然后编写?

时间:2012-10-14 00:25:39

标签: ruby nokogiri

我想制作一个快速的Ruby程序,它允许我读取一个XML文件并对一组特定的子项进行排序,然后将其写回磁盘上。例如:

我想从我编写的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快速完成这项工作?

1 个答案:

答案 0 :(得分:1)

正如您已经从选择的标签中了解到的那样,您选择的工具将是Nokogiri。我在解析你的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