2011-09-28 73 views
2

我從來沒有遇到過將XML從一種形式轉換爲另一種形式的任務。我聽說XSLT只是爲了這個,但我不想去那裏。所以,只用紅寶石和引入nokogiri,哪能:
刪除所有項目元素但是從最初的XML 時間重命名元素時間HammerTime
初始XML:使用ruby/nokogiri將xml轉換爲另一個xml

... 
<item> 
    <time>05.04.2011 9:53:23</time> 
    <iddqd>42</iddqd> 
    <idkfa>woot</idkfa> 
</item> 
<item> 
... 

期望的結果:

... 
<item> 
    <HammerTime>05.04.2011 9:53:23</HammerTime> 
</item> 
<item> 
... 

我想通了如何從XML到陣列採用引入nokogiri的.xpath放數據,但有沒有辦法讓所需要的轉換成另一種XML無需手動編寫類似puts "<HammerTime>#{array['time']}</HammerTime>"的東西?

+0

的引入nokogiri網站有做這種事情[教程](http://nokogiri.org/tutorials/modifying_an_html_xml_document.html)。該文檔也充滿了例子,例如Nokogiri :: XML :: Node。 –

+0

我已經遍佈XML :: Node docs,但未能理解如何去做我想要的。你鏈接到的教程也缺少很多想要的說明。 – bizzz

+0

一步一步來吧。你想重命名一個節點。沒有重命名方法,但有刪除和添加節點方法,以及獲取和設置節點內容的方法。所以你可以做一個副本+刪除+添加。 –

回答

2

在這裏你去:

require 'rubygems' 
require 'nokogiri' 

doc = Nokogiri::HTML <<-EOHTML 
<html> 
    <body> 
    <item> 
     <time>05.04.2011 9:53:23</time> 
     <iddqd>42</iddqd> 
     <idkfa>woot</idkfa> 
    </item> 
    </body> 
</html> 
EOHTML 

hammer = doc.at_css "time" 
hammer.name = 'hammertime' 
doc.css("iddqd").remove 
doc.css("idkfa").remove 

outfile = File.new("output.html", "w") 
outfile.puts doc.to_html 
outfile.close 
+0

謝謝!有沒有辦法做到這一點不是面向HTML的方式? – bizzz

+0

我只是想告訴你一個端到端的例子。這塊代碼也可以在xml上工作。 Nokogiri給你使用css或xpaths的選擇:使用你最喜歡的任何一個。 – ritchielee

0

你是什麼意思與

到另一個XML,而無需手動不必寫類似puts "<HammerTime>#{array['time']}</HammerTime>"

如果要以獨立於語言的方式將XML元素轉換爲另一種XML元素,則可以使用XSLT轉換(或樣式表)。一旦你有了XSLT文件,你可以將它應用於Nokogiri的Nokogiri::XSLT::Stylesheet#apply_to

+0

由此我的意思是我不想手動編寫輸出XML的所有XML語法。 ...我特別不想挖掘XSLT。 – bizzz

+0

然後使用Builder gem。沒有XSLT,沒有字符串操作。 – gioele