Scala 对 XML 文字的支持非常适合生成类型安全的 XHTML 标记;但是,有一个恼人的问题,您必须将文字与 ++
一起 append 。当给定 block 中包含非 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 文字,并在默认情况下返回 Scala 代码?就目前情况而言,在使用 XML 文字时,您会产生一种错误的安全感,因为上面的示例可以编译,但实际上已被破坏。
显式强制 append 文字的一种方法是执行以下操作:
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 文字 block 包装在方法调用中。至少它强制 append ,没有就无法编译。
希望有一个干净的 XHTML 标记 DSL,如果您有的话请提供 secret 武器! (或者如果我遗漏了一些非常明显的东西,请告诉我)。
谢谢
最佳答案
据我所知,处理此类情况的最佳方法是将表达式包装在无操作 <xml:group/>
中。元素:
import scala.xml._
def getNode() = <div>foo</div>
val node: NodeSeq = <xml:group>
<div>bar</div>
<div>baz</div>{
getNode()
}
</xml:group>
产量:
scala> node
res0: scala.xml.NodeSeq =
<div>bar</div>
<div>baz</div><div>foo</div>
关于xml - 隐式 append Scala XML 文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22375209/