2010-11-19 69 views

回答

0

這裏就是我最終想出了:

#!/usr/bin/env ruby 

require "rexml/document" 

filename = ARGV[0] 

if filename 
    f = File.read(filename) 
else 
    raise "Couldn't read file: `#{filename}'" 
end 

doc = REXML::Document.new(f) 

def self.output_hash(attributes={}) 
    count = attributes.size 
    str = "" 
    index = 0 

    attributes.each do |key, value| 
    if index == 0 
     str << " " 
    end 

    str << "#{key.inspect} => " 
    str << "#{value.inspect}" 

    if index + 1 < count 
     str << ", " 
    end 

    index += 1 
    end 

    str 
end 

def self.make_xml_builder(doc, str = "") 
    doc.each do |element| 
    if element.respond_to?(:name) 
     str << "xml.#{element.name}" 
     str << "#{output_hash(element.attributes)}" 

     if element.length > 0 
     str << " do \n" 

     make_xml_builder(element, str) 
     str << "end\n" 
     else 
     str << "\n" 
     end 
    elsif element.class == REXML::Text 
     string = element.to_s 

     string.gsub!("\n", "") 
     string.gsub!("\t", "") 

     if !string.empty? 
     str << "xml.text!(#{string.inspect})\n" 
     end 
    end 
    end 

    str 
end 

puts make_xml_builder(doc) 

生成後,我再格式化它在Emacs。

0

這有點不可能,沒有什麼不同,如果你問 「如何生成Ruby腳本輸出數量3」 的答案可能是:

puts 3 

puts 2+1 

puts [1,2,3].count 

所以,一個回答你的問題是:

xml = File.read('your.xml') 
puts "puts <<EOF\n#{xml}\nEOF" 

無論如何,如果你只是想生成基於生成器腳本,剛生成的XML節點的節點,我想這將使用XSLT是最簡單的。這是一種完全爲此目的構建的語言 - 轉換XML。