スマートフォン向けに会話形式の入力フォームを開発するためにscalaでプログラムを書き始めました。XMLで会話内容を定義して会話画面を作る仕様です。
ブラウザにAjaxにてXMLで定義した会話データを送信するめに、
XMLの特定のタグを置換しようと、scala標準ライブラリのRewriteRuleとRuleTransformerを使ってプログラムを書いてみた。
Blog「devneko is not cat.」のコードを参考にしてRewriteRuleに置換ルールをクラスを定義し、RuleTransformerでRewriteRuleに基づいて置換処理するもの。
package sc import scala.xml._ import scala.xml.transform._ class ReplacementTagRewriteRule(x:String) extends RewriteRule { override def transform(node:Node): Seq[Node] = node match { case e @ Elem(_,"msg",_,_,_*) => <msg>{x}</msg> case other => other } }
置換したいXMLは、<msg>タグの内容を <retmsg>タグの内容に置換したXMLを生成します。
package sc import scala.xml._ import scala.xml.transform._ object testSA { def main(args: Array[String]): Unit = { val defXml = <question id="START"> <msg>あなたのことを知りたいの</msg> <choise> <item result="yes" value="いいよ"/> <item result="no" value="教えない"/> <item result="why" value="どうして?"/> </choise> <ans hantei="match"> <select result="yes" next="2">はい,いいよ,OK,YES</select> <select result="no" next="exit">教えない,いや,いいえ,NG,NO</select> <select result="other" next="again"> <retmsg>「はい」か「いいえ」で答えてください。</retmsg> </select> <select result="why" next="again">どうして? <retmsg>プレゼントを送りたいから</retmsg> </select> </ans> </question> val retmsg = defXml \ "ans" \ "select" \ "retmsg" var message:String = null for(msg <- retmsg){message = msg.text} var node = new RuleTransformer(new ReplacementTagRewriteRule(message))(defXml) println(node) } }
実行すると、<msg>タグの内容が「プレゼントを送りたいから」に置換されます。
<question id="START"> <msg>;プレゼントを送りたいから</msg> <choise> <item result="yes" value="いいよ"/> <item result="no" value="教えない"/> <item result="why" value="どうして?"/> </choise> <ans hantei="match"> <select result="yes" next="2">はい,いいよ,OK,YES</select> <select result="no" next="exit">教えない,いや,いいえ,NG,NO</select> <select result="other" next="again"> <retmsg>「はい」か「いいえ」で答えてください。</retmsg> </select> <select result="why" next="again">どうして? <retmsg>プレゼントを送りたいから</retmsg> </select> </ans> </question>
コメントを残す
コメントを投稿するにはログインしてください。