【发布时间】:2014-04-17 23:39:34
【问题描述】:
Scala 对 XML 文字的支持非常适合生成类型安全的 XHTML 标记;但是,有一个烦人的问题是,当给定块中包含非 xml 文字代码时,您必须将文字与 ++ 运算符一起附加。
例如,这会爆炸:
import scala.xml._
def getNode() = <div>foo</div>
val node: NodeSeq =
<div>bar</div>
<div>baz</div>{
getNode()
}
error: type mismatch;
found : scala.xml.Elem
required: Int
getNode()
在编译下面的代码时,请注意您必须如何在++ 之后 调用非xml 文字的getNode(),否则只会生成尾部Elem。
import scala.xml._
def getNode() = <div>foo</div>
val node: NodeSeq =
<div>bar</div>
<div>baz</div> ++ {
getNode()
}
<div>lonely node</div>
node: scala.xml.NodeSeq = NodeSeq(<div>bar</div>, <div>baz</div>, <div>foo</div>)
res6: scala.xml.Elem = <div>lonely node</div>
那么,有没有一种方法可以隐式链接 XML 文字,其中穿插着 XML,默认返回 Scala 代码?就目前而言,您在使用 XML 文字时会产生一种错误的安全感,因为上面的示例可以编译但实际上被破坏了。
显式强制附加文字的一种方法是执行以下操作:
import scala.xml._
def getNode() = <div>foo</div>
def nodify(elems: Elem*): NodeSeq = elems
nodify(
<div>bar</div>,
<div>baz</div>,
getNode(),
<div>not lonely node</div>
)
res8: scala.xml.NodeSeq = NodeSeq(<div>bar</div>, <div>baz</div>, <div>foo</div>, <div>not lonely node</div>)
但这不是很好,因为您必须将 XML 文字块包装在方法调用中。至少它强制追加,没有就无法编译。
希望有一个干净的 XHTML 标记 DSL,如果你有的话,请提供秘诀! (或者如果我遗漏了一些非常明显的东西,请提示我)。
谢谢
【问题讨论】:
标签: xml scala append literals implicit