私はxmlファイルを持っています。そのファイルから xml_builder ruby コードを生成するにはどうすればよいですか?
注意 - ここでは逆方向に進んでいます (xml を生成する代わりに、ruby コードを生成しています)。
きれいなフォーマットは大したことではありません。後でいつでもフォーマッターで実行できます。
私はxmlファイルを持っています。そのファイルから xml_builder ruby コードを生成するにはどうすればよいですか?
注意 - ここでは逆方向に進んでいます (xml を生成する代わりに、ruby コードを生成しています)。
きれいなフォーマットは大したことではありません。後でいつでもフォーマッターで実行できます。
これが私が最終的に思いついたものです:
#!/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でフォーマットしました。
「数値を出力する Ruby スクリプトを生成する方法」と尋ねられた場合と同じように、それは一種の不可能です3
。答えは次のようになります。
puts 3
また
puts 2+1
また
puts [1,2,3].count
等
したがって、あなたの質問に対する1つの答えは次のようになります。
xml = File.read('your.xml')
puts "puts <<EOF\n#{xml}\nEOF"
とにかく、XML ノードごとに生成する Builder ベースのスクリプトを生成したいだけなら、XSLT を使用するのが最も簡単だと思います。これはまさに、XML の変換という目的のために構築された言語です。