2011-09-28 62 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