如何从XML文件生成xml_builder ruby​​代码

时间:2010-11-19 08:24:34

标签: ruby xml xml-builder

我有一个xml文件。我怎么能从该文件中生成xml_builder ruby​​代码?

注意 - 我在这里倒退(而不是生成xml,我正在生成ruby代码)。

漂亮的格式化并不是什么大问题 - 我总是可以在以后通过格式化程序运行它。

2 个答案:

答案 0 :(得分:0)

这有点不可能,与你问“如何生成输出数字为3的Ruby脚本”不同,答案可能是:

puts 3

puts 2+1

puts [1,2,3].count

因此,您的问题的一个答案是:

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

无论如何,如果你只是想生成基于Builder的脚本,它只是为节点生成XML节点,我想这将是最简单的使用XSLT。这是一种完全用于此目的的语言 - 转换XML。

答案 1 :(得分: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。