2012-10-14 27 views
0

我想制作一个快速的Ruby程序,使我能够读取XML文件并对特定的子集进行排序,然后将其写回到磁盘上。例如:如何读取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

正如您已经从您选择的标签中知道的,您选择的工具将是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 
+0

它的工作原理,但输出是全空白每当我试图打印的内容在末尾 – Flethuseo

+0

您可以一行一行地使用,并使用带状或正则表达式等功能删除多余的空白以匹配2个或更多个空格。 – sunnyrjuneja

相关问题