たのしいXML: RubyでXMLデータを扱う (10) 特定の属性が無い要素を削除
sample10.rb

2008年01月06日(日)更新


■特定の属性が無い要素を削除(sample10.rb)

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

さらら: はい。


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

たけち: 今回は、XMLファイルを読み込んで、それに含まれる要素の指定の属性が無い要素を削除したものをXMLファイルとして出力してみるね。

  • 読み込みXMLファイル名 = sample10_in.xml
  • 出力XMLファイル名 = sample10_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>

     ↓ poet属性の無いpoem要素を削除

出力XMLファイル sample10_out.xml

<?xml version="1.0" encoding="utf-8"?>
<manyo>
  <poem no="0028" poet="持統天皇">春過ぎて夏来るらし白たえの衣干したり天の香具山</poem>
  <poem no="1616" poet="笠郎女">朝ごとに我が見る宿のなでしこの花にも君はありこせぬかも</poem>
  <poem no="4516" poet="大伴家持">新しき年の初めの初春の今日降る雪のいやしけ吉事</poem>
</manyo>

たけち: つまり、rubyでのXMLデータの処理内容は次のようなものになるね

poem要素を削除

さらら: manyoという名前のルート要素の下にあるpoem要素を順にたどって、poetの属性があるかどうかをみるのね。

たけち: そうそう。それで、poet属性が無い(nil)だったら、そのpoemを削除するんだ。要素の削除にはElementクラスの"delete_element"メソッドを使うんだよ。

さらら: わかったわ。

たけち: 簡単だね。じゃ、具体的なソースコードの例を見てみよう。

さらら: はい。


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

Rubyサンプルプログラム(10) sample10.rb
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18

19
20
21
22
23

require "rexml/document"

in_file_name = "sample10_in.xml"
out_file_name = "sample10_out.xml"

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

# manyo要素
manyo = doc.root

# "poet"属性の無いpoem要素を削除
manyo.elements.each { |poem|
    if ( poem.attributes.get_attribute('poet') == nil ) then
        manyo.delete_element(poem)
     end
}

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


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

たけち: 今回のサンプルは、16行目から18行目がポイントだよ。16行目のif 文の中の
    poem.attributes.get_attribute('poet')
で、ひとつのpoem要素のpoet属性を取得しているんだよ。

さらら: それが、 nil だったら、poet属性が無いってことなのね。

たけち: そうだね。そのときには、17行目の
        manyo.delete_element(poem)
が実行されて、そのpoem要素が、manyo要素から削除されるんだね。

さらら: えぇ。


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

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

  • ruby sample10.rb

と入力してみて。

さらら: はい。

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

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

sample10_out.xmlの内容確認

さらら: 確かにpoet属性の無いpoem要素が削除されて、XMLファイルができているわ。

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

さらら: はい。ありがとね。

 → 次回はドキュメントを丸ごとコピーする sample11.rbです。 (^ ^;


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