2011-12-19 67 views
8

我有一個字符串列表,我需要將它們和< br />標籤一起加入到它們之間。因此,從開始:在scala之間加入XML節點的字符串

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

我需要的NodeSeq落得:

line1<br/>line2<br/>line3 

這是可能的列表中僅包含一個元素,在這種情況下,我應該用NodeSeq只是文字的結束( 「LINE1」)。

有沒有一個單線程來做到這一點,使用列表中的一個高階函數?我試着玩foldErft,但似乎無法讓它做我想做的事。

回答

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

請注意,我們必須拓寬類型scala.xml.NodeSeq手動爲Text是過於嚴格的reduce方法。更簡潔

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

將不會編譯。

+0

也許我錯過了一些東西,但我收到「減少」編譯錯誤,說該方法沒有在列表中找到。我需要使用reduceLeft或reduceRight,是否正確? – user1106210 2011-12-19 16:58:23

+0

嗯,適合我。你在使用2.9.1嗎? – Debilski 2011-12-19 17:17:12

+0

啊,這就是爲什麼。我在機器上的一個隨機項目中啓動了控制檯,結果是2.8.1。 – user1106210 2011-12-19 17:42:48

3

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

import scalaz._ 
import Scalaz._ 

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

同意什麼Debilski已經回答了。達到相同的另一種方式是,

import scala.xml._

XML.loadString("<root>" + list.mkString("<br/>") + "</root>").child:NodeSeq

但使用的map/reduce是一個更清潔的方式。

+0

對於無效輸入(比如'List(「<」)'),這個問題非常嚴重。 – Debilski 2011-12-19 16:56:35

+1

我沒有提到它的問題,但這是unsanitized輸入。你的方法是有效的,但是如果列表包含像「asdf」這樣的字符串,它們會被解析而不是顯示出來,從而使Web應用程序可以被攻擊。 – user1106210 2011-12-19 16:57:33