2009-10-12 70 views
3

假設我有這樣的結構:如何使用Ruby刪除重複的XML節點?

<one> 
    <two> 
    <three>3</three> 
    </two> 

    <two> 
    <three>4</three> 
    </two> 

    <two> 
    <three>3</three> 
    </two> 
</one> 

反正有沒有得到這個的:使用Ruby的庫

<one> 
    <two> 
    <three>3</three> 
    </two> 

    <two> 
    <three>4</three> 
    </two> 

</one> 

?我設法使用Nokogiri得到this。從我的測試中,它似乎工作,但也許有另一種方法,一個更好的方法。

+0

酷問題... – khelll 2009-10-12 20:23:52

回答

5

如何處理兩行中的所有內容?

seen = Hash.new(0) 
node.traverse {|n| n.unlink if (seen[n.to_xml] += 1) > 1} 

如果有下兩個不同的父母出現在同一節點的可能性,你希望那些被視爲重複,您可以更改第二行:

node.traverse {|n| n.unlink if (seen[(n.parent.path rescue "") + n.to_xml] += 1) > 1} 
+0

你能否粘貼整個建議的解決方案? – khelll 2009-10-13 04:04:30

+0

偉大的解決方案!似乎我推翻了我的:D – Geo 2009-10-13 07:16:16

+0

這就是整個解決方案。除了要求Nokogiri和設置節點= Nokogiri :: XML(數據)之外,正如他的示例代碼。 – 2009-10-13 13:27:52

0

此頁解釋了Ruby的XML解析一點點http://developer.yahoo.com/ruby/ruby-xml.html

這頁解釋了爲什麼要使用正確的語法分析器過類似的正則表達式的原因: http://htmlparsing.icenine.ca

一目瞭然,你使用的方法似乎並不可怕。

+0

我在這裏使用XML解析器。引入nokogiri。 – Geo 2009-10-12 19:45:29

+0

是的,我從未使用過Nokogiri。我的意思是這個答案更像是一種提供其他解析器的建議的方式,這些解析器其實我聽說過。我包含了習慣性的HTML解析網站。我每天在IRC上回答太多標記解析問題。抱歉。 :) – genio 2009-10-12 20:41:08