scala: программно открывать и закрывать тег XML, используя буквальный синтаксис? - PullRequest
2 голосов
/ 02 мая 2011

Я пишу абстракцию для создания XML в scala, и я хотел бы иметь возможность автоматически закрывать тег 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?

1 Ответ

2 голосов
/ 03 мая 2011

Вот пример использования новой Динамической черты в 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)

Образец кода печатает <one><two>three</two></one>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...