【问题标题】:Using ruby/nokogiri to transform xml to another xml使用 ruby​​/nokogiri 将 xml 转换为另一个 xml
【发布时间】:2011-09-28 13:58:48
【问题描述】:

我从未遇到过将 XML 从一种形式转换为另一种形式的任务。我听说 XSLT 就是为了这个,但我不想去那里。因此,仅使用 ruby​​ 和 nokogiri,我如何:
删除所有 item elementstime初始 XML 以及 rename element timeHammerTime
初始 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>
...

我想出了如何使用 nokogiri 的 .xpath 将数据从 XML 放入数组,但是有没有一种方法可以将所需的转换为另一个 XML,而无需手动编写类似 puts "&lt;HammerTime&gt;#{array['time']}&lt;/HammerTime&gt;" 的东西?

【问题讨论】:

  • Nokogiri 网站有一个tutorial 在做这种事情。文档也充满了示例,例如 Nokogiri::XML::Node。
  • 我已经阅读过 XML::Node 文档,但无法理解如何做我想做的事。您链接到的教程也缺少急需的说明。
  • 一步一步来。你想重命名一个节点。没有重命名方法,但有删除和添加节点方法,以及获取和设置节点内容的方法。所以你可以做一个复制+删除+添加。
  • 你可以用 Nokogiri 重命名节点,看看Node#name=。无需复制/删除/添加(容易出错)。

标签: ruby xml nokogiri


【解决方案1】:

给你:

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

【讨论】:

  • 谢谢!有没有办法以不面向 HTML 的方式做到这一点?
  • 我只是想向您展示一个端到端的示例。那段代码也适用于 xml。 Nokogiri 为您提供了使用 css 或 xpaths 的选项:使用您最熟悉的任何一个。
【解决方案2】:

什么意思

无需手动编写 puts "&lt;HammerTime&gt;#{array['time']}&lt;/HammerTime&gt;" 之类的内容即可导入另一个 XML?

如果您想以一种独立于语言的方式将一个 XML 元素转换为另一个,您可以使用 XSLT 转换(或样式表)。获得 XSLT 文件后,您可以使用 Nokogiri 的Nokogiri::XSLT::Stylesheet#apply_to 应用它。

【讨论】:

  • 我的意思是我不想手动编写输出 XML 的所有 XML 语法。 ...而且我特别不想深入研究 XSLT。
猜你喜欢
  • 2019-05-12
  • 2016-08-26
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多