2004年5月20日号

━━━━━━━━━━━━━━━━━━━━━ 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 << ""
    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 << ""
  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共同体 会員
関西ソーホ・デジタルコンテンツ事業協同組合