如何将scala.xml.Elem转换为Lift中的JsExp?

时间:2011-01-20 12:01:35

标签: scala lift

我的最新问题是我已经有一个解决方案,它只是 感觉应该有更好的方法。

问题: 我想将PartialUpdate发送给彗星服务,我需要XML 转义字符串,以便在客户端使用它时获取 正确的结果。我目前有:

override def lowPriority = { 
  case v: List[TaskOwner] => { 
    partialUpdate( 
      taskOwners.foldLeft(JsCrVar("table", Call("$", Str("table#userTable"))) & 
        Call("table.dataTable().fnClearTable"))((r, c) => { 
        r & Call("table.dataTable().fnAddData", 
          JsArray(Str(Text(c.name).toString), 
            Str(Text(c.initials).toString), 
            Str(makeDeleteButton(c).toString)), 
          Num(0)) 
      }) & Call("table.dataTable().fnDraw")) 
  } 
} 

这很好,但Str(Text(c.name).toString)感觉不错 对我来说很啰嗦。现在,我可以创建一对隐含的 这个转换函数,但似乎应该有 已经在某个地方完成了,我只是不知道在哪里。所以,在 减少我写的代码的精神,我问是否有人知道 更好的方法,或者隐式转换已经存在 某处?

我见过solution here的引用。但是代码总结为:

def xmlToJson(xml: Elem): JsExp = { 
  // code to map XML responses to JSON responses.  Handles tricky things like always returning 
  // js arrays for some fields even if only 1 element appears in the XML
}

2 个答案:

答案 0 :(得分:1)

我不知道Str做了什么,但也许你的意思是Str(xml.Utility.escape(c.name))

那么,怎么样:

def JsStrArray(strings: String*) = JsArray(strings map xml.Utility.escape map Str : _*)

然后使用

JsStrArray(c.name, c.initials, makeDeleteButton(c).toString)

MMMMM。它可能会错误地转义makeDeleteButton的结果。无论如何,你可以玩它,看看看起来不错。

答案 1 :(得分:1)

可能更好的方法是转义名称,而不是:

JsArray(Str(Text(c.name).toString), 
        Str(Text(c.initials).toString), 
        Str(makeDeleteButton(c).toString))

使用

JsArray(Str(c.name.asHtml.toString), 
        Str(c.initials.asHtml.toString), 
        Str(makeDeleteButton(c).toString))

这可以通过在类中使用隐式来进一步减少:

implicit def elemToJsExp(elem: NodeSeq): JsExp = Str(elem.toString)
…
JsArray(c.name.asHtml,
        c.initials.asHtml,
        makeDeleteButton (c))