2009-08-14 60 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(通過生成器)

    標籤之間不會有空格