2010-11-19 5 views

Antwort

0

Hier ist, was ich mit schließlich kam:

#!/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) 

Nach dem Erzeugen, dass ich formatiert sie dann in Emacs.

0

Es ist irgendwie unmöglich, nicht unähnlich, wenn Sie gefragt, "wie Ruby-Skript zu generieren, die Zahl gibt 3", für die Antwort sein könnte:

puts 3 

oder

puts 2+1 

oder

puts [1,2,3].count 

usw.

So

, eine Antwort auf Ihre Frage wäre:

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

Wie auch immer, wenn Sie sich nur Builder basiertes Skript wollen erzeugen, die nur erzeugt XML-Knoten-für-Knoten, ich denke, es wäre am einfachsten mit Hilfe von XSLT . Das ist eine Sprache, die genau für solche Zwecke konstruiert wurde - das Transformieren von XMLs.

Verwandte Themen