━━━━━━━━━━━━━━━━━━━━━ 2004.05.20 Vol.962 ━━━━━
■□■□■
■□■□■ 日刊「WEBのツボ!」
□■□■□ http://www.soho-union.com/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
配信部数 3255部
「続 システムはオブジェクト指向 Ruby & Flash」(#009)
福井修@Fsys.NET
【○】本日のお題 「 XMLの生成と受け渡し 」 ━━━━━━━━━━
さわやかな この頃ですね。皆さんお仕事は、はかどっていますか?
こんにちは、Fsys福井システムリサーチの福井です。
サーバの引越しをしたので、この機会に自サイトのリニューアルを考えていたの
ですが、なかなか時間が取れません^^;; そのうちこっそりやるつもりです。
前回「クラスの生成と部品の利用」注1)にてオブジェクト指向の具体的なメリッ
トの部品化の実装についてカレンダーの例で説明しました。
『 繰り返して 磨けば 光る 』
という話もしましたが、これは「リファクタリング」に通じます。
リファクタリングというのは、平たく言うと「ちゃんと作り直してゆく」ことで
す。詳しくは、マーチン・ファウラーさんの本 注2) を読みましょう。
さて今回は、続けてきた基礎の上で、やっとやりたかったところの「XMLの生成
と受け渡し」についてです。前シリーズの応用編の最後の方でさっとXML連携に
言及したのですが、サーバでのXML生成には、ファイル操作、文字コード、コー
ド変換の話や正規表現の話などがベースになるのでそちらの話を進めてきまし
た。
基礎がないと上物は、立ちませんし。
サーバサイドのDB連携での情報編集は、Rubyの特長を生かして、リッチクライア
ントには、Flashの特長を生かして、そして受け渡しには、XMLを使うというの
は、なかなか良い組み合わせです。
リッチクライアント Flashがサーバサイドと連携するためには、LoadVarsオブジ
ェクトが基本になります。LoadVarsオブジェクトについては、昨年何度か取り上
げました。注3) 今回は XMLオブジェクトを活用します。
まだまだいろいろ説明したいのですがあと2回なので、先を急ぎます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ 実体をcsvで表現してから DBへ 次にDB から 取り出して XML に編集
────────────────────────────────────
グループの表現をDBに格納し、さらにXMLに編集して取り出します。
かなり濃い要素がたっぷり詰まっています^^;;
1. データ構造
親グループ(ノード)名,..子グループ(ノード)名
〔例〕
大グループ,中グループ,小グループ,グループ
会社,部門,部,課,
福井システムリサーチ,技術部門,システム構築部,開発課
福井システムリサーチ,営業部門,営業部,営業1課
福井システムリサーチ,管理部門,総務部,庶務課
:
2. DB構成
create table (
gr_id int; # グループid
gr_name text; # グループ名
sgr_id int; # 親グループid
)
〔データ例〕
0 福井システムリサーチ NULL
1 技術部門 0
2 システム構築部 1
3 開発課 2
4 営業部門 0
5 営業部 4
6 営業1課 5
7 管理部門 0
8 総務部 7
9 庶務課 8
:
3. サーバサイドスクリプト
#─────────────────────────────────
# 子要素を再帰的に取り出すメソッド定義
def getchild( db, gr_id )
out = "" # 結果文字列初期化
sql = "select gr_id,gr_name from grlist where sgr_id=#{gr_id}"
rows = db.query(sql)
rows.each_with_index{ |row,i|
gr_id1 = row[0]
gr_name = row[1]
out << "<#{gr_name} data='#{gr_id}'>"
out << "\r\n"
if gr_id != gr_id1
out << getchild(db, gr_id1)
end
out << "#{gr_name} >"
out << "\r\n"
}
return out
end
:
# xml 編集エリア
xml = ''
xml << '<グループ data="グループ一覧">'
xml << "\r\n"
# 初期の最上位グループ情報検索文
sql = "select gr_id,gr_name from grlist where sgr_id is NULL"
rows = db.query(sql)
# 該当グループ検索&逐次処理
rows.each { |row|
gr_id = row[0]
gr_name1 = row[1]
xml << "<#{gr_name1} data='#{gr_id}'>"
xml << "\r\n"
# 子要素を再帰的に取り出し
xml << getchild( db, gr_id )
xml << "#{gr_name1} >"
xml << "\r\n"
}
xml << 'グループ >'
# EUC to UTF-8変換
uxml = Uconv.euctou8(xml)
#----- データの出力
print "Content-type: text/plain\n\n"
# xml編集結果出力
print uxml
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ リッチクライアントFlashにて XML を受け取り Tree表示
────────────────────────────────────
リッチクライアントの Flash アクションスクリプトで、XMLを受け取り、コンポ
ーネントの Treeで表示します。
ActionScriptの一部を紹介します。
:
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Tree用の XMLデータをサーバに要求
// 送信用LoadVarsオブジェクトの作成
// my_tree というのは、FTreeコンポーネントに名付けたインスタンス名!
mySendVars = new LoadVars();
mySendVars.dataIN = "root";
// 受信用LoadVarsオブジェクトの作成
myLoadVars = new LoadVars();
// Load完時の処理を定義
myLoadVars.onLoad = function(success) {
_root.nodeLabel.text = myLoadVars.dataOUT;
// 応答後に読み込み
my_tree.loadXML("dep_tree.xml");
}
// xml リクエスト
mySendVars.sendAndLoad("getGroup.rb",myLoadVars,"POST");
前回シリーズの第10回 注4) も どうぞ ご参考に。
http://fsys.net/tree/
にて Treeコンポーネント表示の例が参照できます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ まとめ
────────────────────────────────────
今回は XMLの生成と受け渡し を駆け足でやりました。
実体→.csvテキスト表現→DB 2次元表格納→XML表現→Flashリッチクライアント
Tree表現
またまた再帰とかいろいろな要素が出てきましたね。一歩一歩進みましょう。
また 次回でもう少し解説を加えます お楽しみに。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※ 注釈、資料、参考情報
────────────────────────────────────
注1) 続 システムはオブジェクト指向 Ruby & Flash (#008)
「クラスの生成と部品の利用」
http://www.melma.com/mag/02/m00020302/a00000749.html
注2) リファクタリング:プログラムの体質改善テクニック
マーチン・ファウラー 著 児玉 公信 友野 晶夫 平澤 章 梅澤 真史 訳
株式会社ピアソン・エデュケーション 5,040円 ISBN4-89471-228-8
http://www.pearsoned.co.jp/washo/object/wa_obj25-j.html
注3) システムはオブジェクト指向 Ruby & Flash (#007) 2003.10.30 Vol.856
【 実践編 】LoadVars連携での ログイン認証
http://www.melma.com/mag/02/m00020302/a00000651.html
システムはオブジェクト指向 Ruby & Flash (#008) 2003.11.13 Vol.866
【 実践編 】LoadVars連携での DB検索
http://www.melma.com/mag/02/m00020302/a00000661.html
注4) システムはオブジェクト指向 Ruby & Flash (#010) 2003.12.11 Vol.886
【 応用編 】Ruby&Flash&PostgreSQL での 応用例
http://www.melma.com/mag/02/m00020302/a00000681.html
【プロフィール&近況】
福井 修 ( FUKUI Osamu ) o-fukui@po.iijnet.or.jp
福井システムリサーチ http://fsys.net/ 主幹。システム構築歴27年。
システム構築エキスパート
日本Linux協会、神戸商工会議所、情報処理学会、関西IT共同体 会員
関西ソーホ・デジタルコンテンツ事業協同組合員