[英]How to construct a NodeSeq programmatically?
我有一个像这样的NodeSeq
val article_template =
<div>
<div class="title"></div>
<div class="content"></div>
<!-- some other markups don't know -->
</div>
我想为List中的每个文章(定义为val articleList
)创建此结构,结果是:
<div>
<div class="title">title a</div>
<div class="content">content a</div>
<!-- some other markups don't know -->
</div>
<div>
<div class="title">title b</div>
<div class="content">content b</div>
<!-- some other markups don't know -->
</div>
...
更新时间 :
请注意<!-- some other markups don't know -->
部分,因此我不能使用XML文字语法来构造它。 我需要带有相应文章信息的经过修改的article_template
的列表。
这真的是电梯的优点
import net.liftweb.util.Helpers._
case class Article( title: String, content: String )
val articles = List(
Article("title a","content a"),
Article("title b","content b")
)
val snipet =
"article *" #> articles.map { article =>
"header h1 *" #> article.title &
".content *" #> article.content
}
val article_template =
<article>
<header>
<h1>Title</h1>
</header>
<section class="content">
Content
</section>
</article>
snipet( article_template )
您可以使用Group分组XML元素。 在XML文字中,它将如下所示:
val xml =
<xml:group>
<div>
<div class="title">title a</div>
<div class="content">content a</div>
</div>
<div>
<div class="title">title b</div>
<div class="content">content b</div>
</div>
</xml:group>
您可以像这样动态创建XML:
case class Article(title: String, content: String)
val articles = List(Article("A1", "A1 content"), Article("A2", "A2 content"))
val xml =
<xml:group>{articles map { a =>
<div>
<div class="title">{a title}</div>
<div class="content">{a content}</div>
</div>
}}</xml:group>
这是使用模板的另一个变体。 模板只是一个返回XML的函数。 在这种情况下,我使用currying来为每篇文章生成模板列表(仍然需要提供一些东西):
case class Article(title: String, content: String)
val articles = List(Article("A1", "A1 content"), Article("A2", "A2 content"))
def articleTemplate[T](article: Article)(stuff: T) =
<div>
<div class="title">{article title}</div>
<div class="content">{article content}</div>
<div class="stuff">{stuff}</div>
</div>
val allArticles = articles map articleTemplate
val allArticlesWithStuff: NodeSeq =
allArticles.zipWithIndex map {case (f, i) => f(i)}
假设对Article
的定义如下:
case class Article(title: String, content: String)
和articleList
为:
val articleList = List(
Article("title a","content a"),
Article("title b", "content b"))
您可以通过以下方式生成XML片段:
val xml: scala.xml.NodeSeq = articleList map { article =>
<div>
<div class="title">{article.title}</div>
<div class="content">{article.content}</div>
</div>
}
使用flatmap将它们添加在一起,如下所示:
val xml: NodeSeq = List("Test", "Something", "Yo").flatMap(s => <a>{s}</a>)
更新 :匹配也很好
val xml: NodeSeq = List("Test", "Something", "Yo", 1).flatMap{
case s: String => <string>{s}</string>
case i: Int => <int>{i}</int>
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.