Вызов функции для динамического XML в Scala - PullRequest
0 голосов
/ 09 января 2019

Допустим, у меня есть следующий код:

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 голосов
/ 15 января 2019

Полагаю, это моя вина, я пытался сделать вопрос как можно более общим. Ответ, который я искал, был каким-то образом обновить литералы XML из внешнего хранилища во время выполнения.

Лучший способ сделать это - шаблоны. Есть несколько вариантов для Scala:

  • Twirl
  • Scalatags
  • Scalate

Для моего проекта я нашел 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>
0 голосов
/ 09 января 2019

Вы можете попробовать

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

Это представляет XML в формате

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