Play20のコントローラーでXMLを受信する

Play20のアクションメソッドでXMLファイルを受信する場合の処理がうまくいったのでメモっておきます。 本当は、actionの引数でBodyParserを使用したかったのですが、Routesファイルの指定方法がわからなかったので下記のようにしています。

こちらは受信するXMLファイルです。DHXのGridを利用しているのでElementがcellとなっています。

[sourcecode language="xml"] <!--?xml version="1.0"?--> <rows>     <row id='-1343652478024'> <![CDATA[2012/06/28]]> <![CDATA[121]]> ... </row> </rows> [/sourcecode]

次に受信したXMLを処理するためのアクションメソッドです。JavaScriptからXHRで送信していますが、POSTで送信する場合もContent−Typeはtext/xmlに設定する必要があります。Content-Typeがapplication/x-www-form-urlencodedの場合、アクションメソッドでXMLファイルを処理することはできないようです。

[sourcecode language="scala"] def update() = Action { request => { val xml = request.body.asXml.get

  // row Elementのデータをリストで取得する
  val rows = (xml \\ &quot;row&quot;).theSeq
  rows.foreach {
    row =&gt; {…}
 }

} } [/sourcecode]

Scalaについて不勉強なこともあり、いまいちわからなかったのが request.body.asXml で取得できる値が Some(...)となっていることでした。Nullになる可能性があるのでチェックしてから実態を取得するようにという、.NETでいうところのNullable型のようなものですね。本来であれば、きちんとNull判定してからgetする必要があります。

これについては、こちらのサイトがとても参考になりました。ありがとうございます。

やはり、実際に動くものを作り出すとレシピ系の書籍はとても重宝します。ScalaだけではなくPlay20についても記載されています。