2009-08-14 41 views
1

我一直在试图解决这个问题。这是我第一次使用任何脚本语言进行这类工作,我想我可能已经选择了一个艰难的工作开始。实质上,我需要做的是将一些基本的XML转换为较重的XML结构。使用Ruby转换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> 

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

所以,基本上,我问的是:有没有人有任何想法,我可以如何能够以更有效的方式来管理?

回答

2

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

+0

谢谢,我会研究这个。 – VirInvictus 2009-08-14 15:33:33

+1

这种工作完全是XSLT的用途。 – dacracot 2009-08-14 15:33:57

+0

从http://www.oxygenxml.com/查看Oxygen以获得实施良好的XSLT IDE。它具有您从专业IDE期望的所有调试功能,并且可以真正开始学习过程。 – dacracot 2009-08-14 15:38:04

0

Hpricot和生成器组合可能提供您正在寻找。具体的步骤是:

  1. 阅读在XML与角度来说,Hpricot
  2. 从角度来说,Hpricot
+0

我也会研究这一点。谢谢。 – VirInvictus 2009-08-14 15:34:26

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 
遍历元素挑选出你想要的元素
  • 吐出新的XML(通过生成器)

    标签之间不会有空格