2011-12-19 9 views
8

私は文字列のリストを持っており、その間に< br />タグを一緒に結合する必要があります。だから、から始まる:スカラーのXMLノードを持つ文字列を結合する

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

私はのNodeSeqで終わる必要があります。

line1<br/>line2<br/>line3 

それは私がちょうどテキストのNodeSeqで終わる必要があり、その場合には、リストは一つだけの要素が含まれていることが可能です("ライン1")。

リストの上位関数の1つを使用してこれを行うには、1つのライナーがありますか?私はfoldLeftで遊んだりしようとしましたが、私が欲しいことをすることができません。私たちは手動でTextとしてscala.xml.NodeSeqにタイプを広げる必要があり

答えて

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

reduce方法はあまりにも制限的です。より簡潔に

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

はコンパイルされません。

+0

多分私は何かが不足しているかもしれませんが、メソッドがリスト内に見つからないという「reduce」のコンパイルエラーが発生します。 reduceLeftまたはreduceRightを使用する必要がありますか? – user1106210

+0

うーん、私のために働く。 2.9.1を使用していますか? – Debilski

+0

あ、そうです。マシン上のランダムプロジェクトでコンソールを起動しましたが、これは2.8.1でした。 – user1106210

3

あなたがScalazを使用して気にしない場合は、intersperseがあります:

import scalaz._ 
import Scalaz._ 

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

はDebilskiが答えた内容に同意します。同じことを達成するためのもうひとつの方法は、ある

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

しかし、/減らすマップを使用すると、よりクリーンなアプローチである

import scala.xml._

+0

これは 'List(" <")'のような無効な入力をかなり破壊します。 – Debilski

+1

私はこの問題について言及していませんでしたが、これはunsanitized入力です。あなたのアプローチはうまくいきますが、リストに "asdf"のような文字列が含まれていると、それらは表示されるのではなく解析され、攻撃のためにWebアプリケーションが開いたままになります。 – user1106210

関連する問題