函数在Scala中调用动态XML

时间:2019-01-09 12:43:04

标签: scala scala-xml

假设我有以下代码:

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>

有没有反射的可能吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试

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

这表示xml格式为

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

答案 1 :(得分:0)

我想尝试使问题尽可能地笼统是我自己的错。我正在寻找的答案是在运行时从外部存储更新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>