2011-12-19 23 views
8

Dizelerim var ve bunların arasına < br /> etiketleriyle birlikte katılmam gerekiyor. Ben bir NodeSeq ile bitirmek gerekirScaladaki XML düğümü ile dizeleri birleştirin

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

: Yani başlayarak

line1<br/>line2<br/>line3 

Bu liste sadece Metin bir NodeSeq ile bitirmek gerekir bu durumda sadece bir eleman içerir mümkündür ("satır 1").

Bunu yapmak için listedeki yüksek sıralı işlevlerden birini kullanarak tek liner var mı? Ben foldLeft ile oynamayı denedim ama istediğimi yapmak için görünmüyor olabilir. elle Text olarak scala.xml.NodeSeq türünü genişletmek zorunda

cevap

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

Not reduce yöntemi için çok kısıtlayıcı.

, daha ayrıntılı bir şekilde derlenmez. Eğer Scalaz kullanarak sakıncası yoksa

+0

Belki bir şeyleri özlüyorum, ancak yöntemin listede bulunmadığını söyleyen "küçült" konusunda bir derleme hatası alıyorum. ReduceLeft kullanmalı mıyım yoksa Redight'ı mı kullanmalıyım? – user1106210

+0

Hmm, benim için çalışıyor. 2.9.1 kullanıyor musunuz? – Debilski

+0

Ah bu yüzden. Makinemde rastgele bir projede konsolu başlattım, ki bu çıktı 2.8.1 oldu. – user1106210

3

, intersperse var:

import scalaz._ 
import Scalaz._ 

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

Debilski cevap ne katılıyorum. Aynı ulaşma Bir başka yoludur

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

Fakat/azaltmak haritası kullanarak daha temiz bir yaklaşımdır

import scala.xml._

.

+0

Bu, "Giriş (" <")' gibi geçersiz girişlerde oldukça fazla kesinti yapıyor. – Debilski

+1

Sorunda bahsetmedim, ancak bu girişsiz giriş. Yaklaşımınız çalışır, ancak liste "asdf" gibi dizeleri içeriyorsa, görüntülemekten ziyade ayrıştırılır ve bir webapp saldırıya açık kalır. – user1106210