たのしいXML: RubyでXMLデータを扱う (11) ドキュメントを丸ごとコピー
sample11.rb

2008年01月27日(日)更新


■ドキュメントを丸ごとコピー(sample11.rb)

たけち: 前回は要素に指定した属性があるかどうかを判断し、要素を削除する方法を学んだね。

さらら: はい。

たけち: 今回は、入力したドキュメントの構造全体をそのままコピーしてみるね。

さらら: それって、どういう意味があるの?

たけち: うん。そのままだとあんまり意味が無いかもしれないけど、ドキュメントに含まれる要素(Element)のコピーなどを学ぶ前に、簡単だけど最初に学んでおきたいと思ってね。

さらら: そうなんだ。


■読み込むXMLファイルと出力するXMLファイル

たけち: 今回は、XMLファイルを読み込んで、それを丸ごとコピーしてXMLファイルとして出力してみるね。読み込みXMLファイルは前回のものと同じでいいよね。

  • 読み込みXMLファイル名 = sample10_in.xml
  • 出力XMLファイル名 = sample11_out.xml
読み込みXMLファイル sample10_in.xml

<?xml version="1.0" encoding="utf-8"?>
<manyo>
  <poem no="0028" poet="持統天皇">春過ぎて夏来るらし白たえの衣干したり天の香具山</poem>
  <poem no="1616" poet="笠郎女">朝ごとに我が見る宿のなでしこの花にも君はありこせぬかも</poem>
  <poem no="2540">振分けの髪を短み青草を髪にたくらむ妹をしぞ思ふ</poem>
  <poem no="3787">妹が名に懸けたる桜花咲かば常にや恋ひむいや年のはに</poem>

  <poem no="4516" poet="大伴家持">新しき年の初めの初春の今日降る雪のいやしけ吉事</poem>
</manyo>

たけち: 今回は、丸ごとコピーだから図で説明する必要は無いよね。

さらら: そっ、そうよね。(^ ^;

たけち: じゃ、いきなりだけど、具体的なソースコードの例を見てみよう。

さらら: はい。


■Rubyサンプルプログラム(11) sample11.rbのソースコード

Rubyサンプルプログラム(11) sample11.rb
01
02
03
04
05
06
07
08
09
10
11
12

13
14
15
16

require "rexml/document"

in_file_name = "sample10_in.xml"
out_file_name = "sample11_out.xml"

doc = nil
File.open(in_file_name) {|xmlfile|
doc = REXML::Document.new(xmlfile)
}

# docインスタンスをまるごとout_docにコピー
out_doc = doc.deep_clone()

File.open(out_file_name,"w") do |outfile|
    out_doc.write(outfile, 0)
end


※ここでは、文字コードをutf-8としてsample11.rbを作成しています。

たけち: 今回のサンプルは、12行目がポイントだよ。
out_doc = doc.deep_clone()
で、docを丸ごと、つまりのmnayo要素やすべての属性、すべとの子要素のコピーを生成しているんだよ。

さらら: deep_clone()というのを使うのね。

たけち: そうだね。で、15行目は
    out_doc.write(outfile, 0)
となっているのに気をつけてね。

さらら: はい。


■サンプルプログラムsample11.rbの実行結果の確認

たけち: じゃ、このsample11.rbを実行した結果をみてみよう。コマンドプロンプトウィンドウで

  • ruby sample11.rb

と入力してみて。

さらら: はい。

さらら: "sample11_out.xml"というファイルができたわ。

たけち: ちゃんと実行できたみたいだね。じゃあ、"sample11_out.xml"ファイルの内容を見てみよう。

sample11_out.xmlの内容確認

さらら: 確かに入力の"sample10_in.xml"と同じXMLファイルができているわ。

たけち: ここで使ったdeep_clone()は、ある要素をその子要素を含んでコピーを作るときにも使えるんだよ。これについては、あとでサンプルを作って試してみようね。

さらら: はい。

たけち: じゃ、今回はここまでにするね。

さらら: ありがとね。

 →次回は要素をソートして表示 sample12.rbです。 (^ ^;


[たのしいXML のインデックス]へ