REXML
Ruby上で動作するXMLプロセッサで、ツリー解析とストリーム解析の両方の文書解析をサポートします。Ruby1.8からは標準添付されているライブラリです。
1-1.プロジェクトの生成
(1) プロジェクトAppli026を生成する
(2) 日本語環境の設定
(3) データベースの作成
テストをする場合はProject_testの環境で実施されるのでDBもそれに対応します。(db:create:allの指定)
NetBeansで[Rakeタスクを実行/デバッグ..]を選択します。
フィルタ(F):
パラメータ(P):
一致するタスク(M):db:create:all
(in D:/Rails_Projects/Appli026)
1-2.xmlファイルの作成
価格.comからサンプルデータを得て、次のようなxmlファイルを作成しましょう。
バイデザイン 74,800 131
東芝 78,000 7
シャープ 80,000 18
三菱電機 80,500 45
SONY 83,800 27
ユニデン 88,000 310
シャープ 89,800 30
SONY 89,800 66
東芝 91,200 123
東芝 92,684 8
1-3.アプリケーションの作成
(1) コントローラの生成
NetBeansで[生成…]を選択します。
ジェネレート(G): controller
名前(N): xml
ビュー(V):
exists app/controllers/
exists app/helpers/
create app/views/xml
exists test/functional/
create test/unit/helpers/
create app/controllers/xml_controller.rb
create test/functional/xml_controller_test.rb
create app/helpers/xml_helper.rb
create test/unit/helpers/xml_helper_test.rb
(2) コントローラの編集
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")
end
end
(3) ビューの作成
<%=h @doc %>
(4) 動作確認
登録したxmlファイルが読み込まれることを確認するため、ブラウザからhttp://127.0.0.1:3000/xml/でプログラムを起動します。
1-4.さまざまな機能
詳細な仕様はhttp://pub.cozmixng.org/~kou/rexml-doc-ja/でみることができますが、ここではその幾つかを紹介します。
(1) 要素の取り出し
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")
# 要素の取り出し
@makers=""
@doc.elements.each("tv/model/maker") { |element|
@makers += element.to_s + "<br>"
}
end
end
<br/>
makers<br/>
--------<br/><%= @makers %>
makers
----------
バイデザイン
東芝
シャープ
三菱電機
SONY
ユニデン
シャープ
SONY
東芝
東芝
(2) 属性の取り出し
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")
# 属性の取り出し
@names=""
XPath.each(@doc, "//model/attribute::name") { |element|
@names += element.to_s + "<br>"
}
end
end
<br/>
names<br/>
--------
<%= @names %>
names
--------
ALF-4205DB (42)
REGZA 40A8000 (40)
AQUOS LC-40AE6 (40)
REAL LCD-40MXW300 (40)
BRAVIA KDL-40EX500 (40)
TL42DZ1-B (42)
AQUOS LC-40DS6 (40)
BRAVIA KDL-40V5 (40)
REGZA 42C8000 (42)
REGZA 40R9000 (40)
(3) XMLの削除
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")
# XMLデータの削除
@doc.elements.delete("tv/model[1]") # modelという名の要素の中で一番目の要素を削除する
end
end
doc<br>
--------</br><%=h @doc %>
doc
--------
バイデザイン 74,800 131
東芝 78,000 7
シャープ 80,000 18
三菱電機 80,500 45
SONY 83,800 27
ユニデン 88,000 310
シャープ 89,800 30
SONY 89,800 66
東芝 91,200 123
東芝 92,684 8
(4) XMLの更新
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")
# XMLデータの更新
@doc.elements["tv/model[@name='REGZA 40R9000 (40)']/price"].text = "91,500"
# modelという要素のnameという属性が'REGZA 40R9000 (40)'である要素に含まれるpriceの値を
# 91,500に変更する
end
end
<br/>
doc<br/>
--------<br/><%=h @doc %>
doc
--------
東芝 78,000 7
シャープ 80,000 18
三菱電機 80,500 45
SONY 83,800 27
ユニデン 88,000 310
シャープ 89,800 30
SONY 89,800 66
東芝 91,200 123
東芝 91,500 8
(5) XMLの追加
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")# XMLデータの追加
root = @doc.rootmodel = Element.new "model"
model.attributes["name"] = "AQUOS LC-40DS6 (40)"maker = Element.new "maker"
price = Element.new "price"
ranking = Element.new "ranking"model.add_element "maker"
model.elements["maker"].text = "シャープ"
model.add_element "price"
model.elements["price"].text = "92,000"
model.add_element "ranking"
model.elements["ranking"].text = "30"root.add_element model
end
end
<br/>
doc<br/>
--------<br/><%=h @doc %>
doc
--------
東芝 78,000 7
シャープ 80,000 18
三菱電機 80,500 45
SONY 83,800 27
ユニデン 88,000 310
シャープ 89,800 30
SONY 89,800 66
東芝 91,200 123
東芝 92,684 8
シャープ 92,000 30
(6) XMLの出力
class XmlController < ApplicationController
require "rexml/document"
include REXMLdef index
@doc = Document.new File.new("tvbest10.xml")
# XMLファイルの出力
File.open("tvbest11.xml","w") do |outfile|
@doc.write(outfile)
end
end
end