使用Ruby转换XML结构

时间:2009-08-14 15:13:22

标签: xml ruby transformation

我一直在试图解决这个问题。这是我第一次使用任何脚本语言进行此类工作,我想我可能会选择一份艰苦的工作。从本质上讲,我需要做的是将一些基本的XML转换为更重的XML结构。

示例:

翻译以下内容:

<xml>
  <test this="stuff">13141</test>
  <another xml="tag">do more stuff</another>
<xml>

进入这个:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Package>
<Package version="1.0">
  <tests>
    <test name="stuff">
      <information>13141</information>
    </test>
  </tests>
  <anothers>
    <another name="tag">
      <information>do more stuff</information>
    </another>
  </anothers>
</Package>

我已尝试通过正则表达式手动执行此操作,但这需要做很多工作。我已经尝试将多个测试标签存储到一个数组中,因此我可以将它们保存到第二个示例中的tests标签中,但我似乎无法跟踪所有内容。我查看了REXML和Hpricot,但无法弄清楚如何使用它们来正确地执行此操作。

所以,基本上,我要问的是:有没有人对如何以更有效的方式管理这个有任何想法?

3 个答案:

答案 0 :(得分:2)

了解XSLT。我只熟悉这项技术,但它的用途是将XML文档从一种形式转换为另一种形式,这听起来就像你需要的那样。

答案 1 :(得分:1)

require 'rubygems'
require 'hpricot'
require 'activesupport'

source = <<-XML
<xml>
<test this="stuff">13141</test>
<another xml="tag">do more stuff</another>
</xml>
XML

def each_source_child(source)
  doc = Hpricot.XML(source)

  doc.at('xml').children.each do |child|
    if child.is_a?(Hpricot::Elem)
      yield child
    end
  end
end

output = Hpricot.build do |doc|
  doc << '<?xml version="1.0" encoding="UTF-8"?>'
  doc << '<!DOCTYPE Package>'
  doc.tag! :Package, :version => '1.0' do |package|
    each_source_child(source) do |child|
      package.tag! child.name.pluralize do |outer|
        outer.tag! child.name, :name => child.attributes.values.first do |inner|
          inner.tag! :information do |information|
            information.text! child.innerText
          end
        end
      end
    end
  end
end

puts output

标签之间不会有空格

答案 2 :(得分:0)

Hpricot和Builder结合使用可能会提供您所需要的功能。步骤将是:

  1. 使用Hpricot读入XML
  2. 选择您想要的元素
  3. 通过迭代Hpricot
  4. 中的元素,吐出新的XML(通过Builder)