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

发布于 2024-11-04 10:10:50 字数 464 浏览 0 评论 0原文

我正在编写一个用于在 scala 中创建 XML 的抽象,并且我希望能够在 XML 标签打开后自动关闭它。所需的语法是灵活的,但理想情况下它看起来像这样:

tag <div> {
  // define more markup in here
  tag <br/>
  {
    // some expression that results in more XML tags
  }
}

哪里是(部分)XML 文字,“标签”是自定义控制结构 - 而不必像这样显式打开和关闭标签:

<div> <br/> { /* some expression */ } </div>

我希望以仍然允许我使用 XML 文字语法的方式执行此操作,而不是通过将标签标签指定为字符串来手动创建元素。这可以用scala以任何方式实现吗?

i'm writing an abstraction for creating XML in scala, and i'd like to be able to automatically close an XML tag once it is open. the desired syntax is flexible, but ideally it would look something like this:

tag <div> {
  // define more markup in here
  tag <br/>
  {
    // some expression that results in more XML tags
  }
}

where is a (partial) XML literal and "tag" is a custom control structure -
instead of having to explicitly open and close tags like this:

<div> <br/> { /* some expression */ } </div>

i'd like to do this in a way that still lets me use XML literal syntax, as opposed to manually creating element by specifying the tag label as a string, for example. is this possible in any way with scala?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

驱逐舰岛风号 2024-11-11 10:10:50

这是使用新的 的示例Scala 2.9 中的动态特征。您必须使用 -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)

该代码示例打印

Here is an example using the new Dynamic trait in Scala 2.9. You will have to compile it with -Xexperimental. If you only need a certain number of tags(such as all html tags) you can do the same in 2.8 by writing one method per tag.

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)

The code sample prints <one><two>three</two></one>.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文