<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しようと考えています。
サンプルを作ってみました。
# データ準備 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の内容をチェック)
※コードの記述方法については、これがベストとは間違っても申せません。
処理の流れをチェックする程度にご理解ください。
サンプル、ありがとうございます! まだ実験中ですが、質問の回答は満たしていただいております! 多謝っす☆