Rubyについてです。以下のようなパターンの文字

Writer: admin Type: arte Date: 2019-01-08 00:00
Rubyについてです。以下のようなパターンの文字列を解析し、hoge.txtの形式のxmlを出力するプログラムはどう書けばよいか教えていただけませんか?***文字列***"root,ELEM,a,name,a1,ATTR,b,bbb1,ATTR,b,bbb2,ELEM,a2"***hoge.txt***<root> <a name="a1"> <b>bbb1</b> <b>bbb2</b> </a> <a2></a2></root>a,a2を並列でrootのelemにする方法が分からずに困っております。よろしくお願いします。共感した0###あまり汎用性ないですけど。https://pastebin.com/pEb3A6hZナイス0
###度々ありがとうございます!###初見で一見した際「構文規則は?」と悩んだのですがcd62131さん の示されたコード中にある[正規表現だと]/(?<fld>Tag(,Key,Val)*(,Txt)?(,Chd,(\g<fld>))*)/みたいな入れ子形式が興味深かったので、 再帰下降構文 対応に一応 直してみました[※未精査]。↓コレで、chdに3階層目以降のKEY文字列を追加すれば子要素としてぶら下げられます[副作用として、rootノードにも属性とテキストが付与可能に]。#https://ideone.com/7D0yDV#require 'rexml/document'##(root (ELEM (a name a1) (ATTR (b bbb1)) (ATTR (b bbb2))) (ELEM (a2)))chd=%w(ELEM ATTR DETL)src=[  'root,rky,rvl,rtx',    'ELEM,a,name,a1',      ['ATTR,b,bbb1',       'ATTR,b,bbb2',[         'DETL,c1,ck,cv,ccc1',         'DETL,c2,ccc2'],       'ATTR,b,bbb3'],    'ELEM,a2'].join(',')elm=src.split(',')fld=proc{|inp,sep|  a=[]  inp.slice_before{|e|e==sep.first}.each{|f|    f.shift if f.first==sep.first    if 1<sep.size      b=fld.(f, sep.drop(1))    else      b=REXML::Element.new f.shift      f.each_slice(2){|g|        b.text,         =g if g.size==1        b.add_attribute *g if g.size==2      }    end    a<<b  }  a.first.elements<<a.delete_at(1) while 1<a.size  a.first}doc=REXML::Document.newrtnd=fld.(elm, chd)doc<<rtnd if rtnd##doc.write($stdout,2); puts##ForTest##open('hoge.xml', 'w') {|f| doc.write(f,2); f.puts }ナイス0

 

TAG