我有一个xml文件。如何从该文件中生成 xml_builder ruby 代码?
注意 - 我在这里有点倒退(而不是生成 xml,我正在生成 ruby 代码)。
漂亮的格式化没什么大不了的——我以后总是可以通过格式化程序运行它。
我有一个xml文件。如何从该文件中生成 xml_builder ruby 代码?
注意 - 我在这里有点倒退(而不是生成 xml,我正在生成 ruby 代码)。
漂亮的格式化没什么大不了的——我以后总是可以通过格式化程序运行它。
这有点不可能,就像您问“如何生成输出数字的 Ruby 脚本3”一样,因为答案可能是:
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。
这是我最终想出的:
#!/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 中对其进行了格式化。