我正在编写一个用于在scala中创建XML的抽象,并且我希望能够在XML标记打开后自动关闭它。所需的语法是灵活的,但理想情况下它看起来像这样:
tag <div> {
// define more markup in here
tag <br/>
{
// some expression that results in more XML tags
}
}
其中是(部分)XML文字,“tag”是自定义控件结构 - 而不必像这样明确地打开和关闭标签:
<div> <br/> { /* some expression */ } </div>
我想以一种仍然允许我使用XML文字语法的方式执行此操作,而不是通过将标记标签指定为字符串来手动创建元素。这对scala有什么用?
答案 0 :(得分:2)
以下是使用Scala 2.9中的新Dynamic trait的示例。您必须使用-Xexperimental
进行编译。如果您只需要一定数量的标签(例如所有html标签),则可以在2.8中为每个标签编写一个方法。
import scala.xml.{TopScope, Elem, Text, Node}
import scala.xml.NodeSeq.Empty
object tag extends Dynamic {
def applyDynamic(tag: String)(children: Any) = {
val node = children match {
case node:Node => node
case s:String => Text(s)
case _ => Empty
}
Elem(null, tag, null, TopScope, node:_*)
}
}
val xml = tag one { tag two {"three"} }
println(xml)
代码示例打印<one><two>three</two></one>
。