繁体   English   中英

如何以编程方式构造NodeSeq?

[英]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>

更新1

这是使用模板的另一个变体。 模板只是一个返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM