6

我在由 Play 框架驱动的 webapp 中有简单的实体。它看起来像这样:

case class MyItem(id: Option[Long] = None, name: String, comments: List[Comment])
case class Comment(commentDate: Date, commentText: String)

我从 DB 中得到如下所示的 XML:

<?xml version="1.0"?>
<item>
    <id>1</id>
    <name>real item</name>
    <comments> 
        <comment>
            <comment_date>01.01.1970</comment_date>
            <comment_text>it rocks</comment_text>
        </comment>
        <comment>
            <comment_date>02.01.1970</comment_date>
            <comment_text>it's terrible</comment_text>
        </comment>      
    </comments>
</item>

现在我不知道将其解析为模型和表单映射。

我的表单映射以防万一(现在不编译):

  val itemForm = Form(
    mapping(
      "id" -> optional(longNumber),
      "name" -> nonEmptyText,
      "comments" -> list(mapping(
          "commentDate" -> date("dd.mm.yyyy"),
          "commentText" -> text
      )(Comment.apply)(Comment.unapply))
    )(MyItem.apply)(MyItem.unapply)
  )
4

2 回答 2

4

这是问题第一部分的示例代码:

import scala.xml.{Comment => _, _}


case class Comment(commentDate: String, commentText: String)
case class MyItem(id: Option[Long] = None, name: String, comments: List[Comment])

object MyParser {
  def parse(el: Elem) =
    MyItem(Some((el \ "id").text.toLong), (el \ "name").text,
      (el \\ "comment") map { c => Comment((c \ "comment_date").text, (c \ "comment_text").text)} toList)

}

REPL 的结果:

scala> MyParser.parse(xml)
MyParser.parse(xml)
res1: MyItem = MyItem(Some(1),real item,List(Comment(01.01.1970,it rocks), Comment(02.01.1970,it's terrible)))

我自由地更改了commentDateto,String因为我想让程序看起来更简单。解析Date非常简单,阅读Joda Time 库文档就足够了。

于 2013-10-08T12:18:18.890 回答
0

表单映射不进行 XML 解析,仅进行表单解析,您必须使用 Scala XML 支持(或您喜欢的某些库)。搜索互联网,您会发现许多如何使用它的示例。

于 2013-10-08T11:58:40.813 回答