Scala 中动态 XML 的函数调用

Function calls for dynamic XML in Scala

假设我有以下代码:

import scala.xml._

def foo(bar:String) = s"The FOO is $bar"

var xml =
    <a type ={foo("attribute")}>
        {foo("text node")}
    </a>

val txt = "<a>{foo(\"updated\")}</a>"

XML.loadString(txt)

结果是

xml: scala.xml.Elem = <a>{foo(&quot;updated&quot;)}</a>

制作它的规范方法是什么

xml: scala.xml.Elem = <a>The FOO is updated</a>

甚至可以不用反射吗?

你可以试试

val txt1 = s"<a>${foo("updated")}</a>"
XML.loadString(txt1)

这表示 xml 格式为

res0: scala.xml.Elem = <a>The FOO is updated</a>

我想这是我自己的错,因为我试图让这个问题尽可能笼统。我正在寻找的答案是在运行时从外部存储更新 XML 文字的某种方式。

做到这一点的最佳方式是模板引擎。 Scala 有几个选项:

  • 旋转
  • Scalatags
  • 升级

就我的项目而言,我发现 Scalate 是最合适的。所以,回答我自己的问题,它看起来像这样:

import scala.xml._
import org.fusesource.scalate._

def foo(bar:String) = s"The FOO is $bar"

val engine = new TemplateEngine
val template = engine.load("test.ssp", List(Binding("foo", "String")))
val str1 = engine.layout("test.ssp",Map("foo"-> foo("bar")))
val str2 = engine.layout("test.ssp",Map("foo"-> foo("updated")))

模板 "test.ssp" 很简单:

<a>${foo}</a>