2012-10-14 26 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

相關問題