Как сгенерировать код xml_builder из файла XML - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть XML-файл. Как я могу сгенерировать xml_builder ruby-код из этого файла?

Обратите внимание - я как бы возвращаюсь назад (вместо генерации XML, я генерирую код ruby).

Хорошее форматирование не имеет большого значения - я всегда могу запустить его через форматировщик позже.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2010

Вот что я в итоге придумал:

#!/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 голосов
/ 19 ноября 2010

Это в некотором роде невозможно, в отличие от того, если вы спросите «как сгенерировать скрипт 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.

...