人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

RubyのREXMLで、下記のような構造のデータを、イテレータでidごとに処理したいのです;

<a id="1">
<b>あ</b>
<c>い</c>
<d>
<e>う</e>
<f>え</f>
</d>
</a>
<a id="2">
<b>あ</b>
<c>い</c>
<d>
<e>う</e>
<f>え</f>
</d>
</a>







いろいろチュートリアルを見ても、<b></b>など1種類の要素だけをイテレータで連続して取得する方法はあっても
<b>と<c>と<e>と<f>など、複数の要素を配列に入れるなどして、連続取得する方法がみつかりませんでした。

どなたか、複数の要素をイテレータで取得する方法を教えてください。


ちなみに最終的には、配列に入れたものを、
MySQLにinsertしようと考えています。

●質問者: gets_itai
●カテゴリ:ウェブ制作
✍キーワード:MySQL Ruby イテレータ チュートリアル データ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● kn1967
●200ポイント ベストアンサー

サンプルを作ってみました。

# データ準備
require "rexml/document"
doc = REXML::Document.new '
<?xml version="1.0" ?>
<data>
<a id="1"><b>aaa</b><c>aab</c><d><e>aac</e><f>aad</f></d></a>
<a id="2"><b>bba</b><c>bbb</c><d><e>bbc</e><f>bbd</f></d></a>
</data>
'
# 関数
def saiki(e1, k, v)
 if e1.text then
 k.push e1.name
 v.push "'" + e1.text + "'"
 elsif e1.children then
 e1.elements.each {|e2|
 saiki(e2, k, v)
 }
 end
end
# 呼び出し
doc.elements.each("data/a") {|e|
 k = Array.new(['id'])
 v = Array.new([e.attributes['id']])
 saiki(e, k, v)
 p "INSERT INTO tablename (" + k.join(",") + ") VALUES (" + v.join(",") + ")"
}

出力結果は以下のようになります。

"INSERT INTO tablename (id,b,c,e,f) VALUES (1,'aaa','aab','aac','aad')"
"INSERT INTO tablename (id,b,c,e,f) VALUES (2,'bba','bbb','bbc','bbd')"

※さらに調べるのであれば関数の再帰呼び出しがキーワードになります。

※MySQLとの接続関連は行ってません。単純に生成したSQL文を出力します。

※当方の環境で少々文字化けを起こしたので、

スミマセンがデータはアルファベットにしてます。

※xmlの要素が存在しなくてもINSERT文の生成を行ってしまいますので、

実際の運用に際しては要素存在有無のチェックを入れる必要があります。

(saiki関数から返ってきたkとvの内容をチェック)

※コードの記述方法については、これがベストとは間違っても申せません。

処理の流れをチェックする程度にご理解ください。

◎質問者からの返答

サンプル、ありがとうございます! まだ実験中ですが、質問の回答は満たしていただいております! 多謝っす☆

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ