scala:使用文字语法以编程方式打开和关闭XML标记?

时间:2011-05-02 01:46:33

标签: xml scala

我正在编写一个用于在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有什么用?

1 个答案:

答案 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>