【问题标题】:Join strings with XML node between in scala在scala中加入带有XML节点的字符串
【发布时间】:2014-06-27 01:47:36
【问题描述】:

我有一个字符串列表,我需要将它们与中间的
标签连接在一起。所以从:

val list = List("line1", "line2", "line3")

我需要得到一个 NodeSeq:

line1<br/>line2<br/>line3

列表可能只包含一个元素,在这种情况下,我应该以 Text("line1") 的 NodeSeq 结束。

是否有一个单行来执行此操作,使用列表中的高阶函数之一?我试过玩 foldLeft 但似乎无法让它做我想做的事。

【问题讨论】:

    标签: xml scala


    【解决方案1】:
    list.map(scala.xml.Text(_):scala.xml.NodeSeq).reduce(_ ++ <br /> ++ _)
    

    请注意,我们必须手动将类型扩大到scala.xml.NodeSeq,因为Textreduce 方法的限制太大。越简洁

    list.map(scala.xml.Text).reduce(_ ++ <br /> ++ _)
    

    不会编译。

    【讨论】:

    • 也许我遗漏了一些东西,但是我在“reduce”上得到一个编译错误,说在列表中找不到该方法。我需要使用 reduceLeft 或 reduceRight,对吗?
    • 啊,这就是为什么。我在我机器上的一个随机项目中启动控制台,结果是 2.8.1。
    【解决方案2】:

    如果你不介意使用Scalaz,还有intersperse

    import scalaz._
    import Scalaz._
    
    list.map(xml.Text(_): xml.Node).intersperse(<br/>): xml.NodeSeq
    

    【讨论】:

      【解决方案3】:

      同意 Debilski 的回答。实现相同目标的另一种方法是,

      import scala.xml._

      XML.loadString("&lt;root&gt;" + list.mkString("&lt;br/&gt;") + "&lt;/root&gt;").child:NodeSeq

      但使用 map/reduce 是一种更简洁的方法。

      【讨论】:

      • 这几乎破坏了无效输入,例如List("&lt;")
      • 我没有在问题中提到它,但这是未经处理的输入。您的方法有效,但如果列表包含像“asdf”这样的字符串,它们会被解析而不是显示,从而使 web 应用程序容易受到攻击。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多