Nokogiriメモ。XMLファイルを出力する

前回書いたのが、
NokogiriでXMLを読み込み・解析する手法。

今度はXMLをファイル出力をする方法を書きます。

データはHashでもっていたとします。
(もちろん、やり方さえ覚えておけばオブジェクトやら配列からうまいこともできるでしょう)

[Ruby] [Nokogiri] Hash から XML へコンバートする
http://blog.goo.ne.jp/the_simple_1500/e/2c62a0e4ce81f3692bb6a40c8f7a4295

[ruby] Nokogiriのparse時の文字コード
http://blog.goo.ne.jp/the_simple_1500/e/2c62a0e4ce81f3692bb6a40c8f7a4295

こちら2つの記事を参考にさせていただきました。

require "nokogiri"

#基本形
xml_object = Nokogiri::XML::Builder.new do |xml|
  xml.root_node_name #何でも良い。多分method_missingで拾わせてる
    xml.node_name{xml.text "value"}
  end
end

#属性もつけたい場合は上記をこうする
xml_object = Nokogiri::XML::Builder.new do |xml|
  xml.root_node_name #何でも良い。多分method_missingで拾わせてる
    xml.node_name(:attribute_name => "attribute_value"){xml.text "value"}
  end
end
#node_nameに引数でHashで渡せば、属性としてXML化される。簡単


実際に、Hashのデータを元にXMLを出力する

hash_data = Hash.new(0)
hash_data[:access_count] = 1_000_000
hash_data[:access_user_count] = 300_000
hash_data[:hoge] = "hogehoge"
hash_data[:fuga] = "omoitsukanai"
hash_data[:piyo] = "uhyoo-!"

xml_object = Nokogiri::XML::Builder.new do |xml|
  xml.root_node_name #何でも良い。多分method_missingで拾わせてる
    hash_data.each |key, value|
      eval("xml.#{key} {xml.text #{value}}")
    end
  end
end

#ファイル出力&文字化け対応 最後の.toutf8いらないかもしれない
File.open("出力ファイル名.xml", "w") do |file|
  file.puts Nokogiri::XML(xml_object.to_xml, nil, 'utf-8').to_xml.toutf8
end

更に子ノードを作りたい場合などは、
ちょっと工夫したら案外簡単です。

XMLを読み込むコードより、XMLを作り出すコードの方が簡単な気がします。
どっちも、構造次第ですが、
双方を変換出来るようなコードのスクリプトを組んだら解析する方が大変でした。


以上、前回日記とあわせて、
Nokogiriを用いた
XML出力←→XML解析
の両方の簡易メモっと。


応用的な事でもっとイケてる事がわかったら、
またNokogiriタグつけた日記書くかも。


とりあえずTW(ネトゲ)のチャットログ(HTML)の集計・解析で、
動作設定の元になる情報をXMLで書いて読み込ませたり、逆に設定をXML出力させるのはざっくり出来た。
後はもうちょっと簡単にXML入力をさせるための何かを作ったり、
経験値データの扱いを少し変えれば人様がある程度使いやすい状態にはなる・・・かなー。

日曜いっぱいまでに落ち着かせるのが目標。