2011-12-19 19 views
8

Tôi có một danh sách các chuỗi và tôi cần tham gia cùng với các thẻ < br /> ở giữa. Vì vậy, bắt đầu từ:Tham gia chuỗi với nút XML giữa trong scala

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

tôi cần phải kết thúc với một NodeSeq của:

line1<br/>line2<br/>line3 

Có thể danh sách chỉ chứa một phần tử, trong trường hợp này tôi nên kết thúc với một NodeSeq chỉ của văn bản ("dòng 1").

Có một lớp lót để thực hiện việc này hay không, sử dụng một trong các hàm bậc cao hơn trong danh sách? Tôi đã cố gắng để chơi xung quanh với foldLeft nhưng dường như không thể làm cho nó để làm những gì tôi muốn.

Trả lời

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

Lưu ý rằng chúng ta phải mở rộng các loại để scala.xml.NodeSeq thủ công như Text là quá hạn chế cho phương pháp reduce. Càng ngắn gọn hơn

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

sẽ không biên dịch.

+0

Có thể tôi đang thiếu điều gì đó, nhưng tôi nhận được lỗi biên dịch về "giảm" nói rằng phương thức không được tìm thấy trong danh sách. Tôi cần sử dụng reduceLeft hoặc reduceRight, đúng không? – user1106210

+0

Hmm, phù hợp với tôi. Bạn đang sử dụng 2.9.1? – Debilski

+0

Đó là lý do tại sao. Tôi bắt đầu lên bàn điều khiển trong một dự án ngẫu nhiên trên máy tính của tôi, hóa ra là 2.8.1. – user1106210

3

Nếu bạn không nhớ sử dụng Scalaz, có intersperse:

import scalaz._ 
import Scalaz._ 

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

Đồng ý với những gì Debilski đã trả lời. Chỉ là một cách để đạt được điều này cũng,

import scala.xml._

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

Nhưng sử dụng bản đồ/giảm là một phương pháp sạch hơn nhiều.

+0

Điều đó xảy ra khá nhiều trên đầu vào không hợp lệ, chẳng hạn như 'List (" <")'. – Debilski

+1

Tôi đã không đề cập đến nó trong vấn đề, nhưng đây là đầu vào không an toàn. Cách tiếp cận của bạn hoạt động, nhưng nếu danh sách chứa các chuỗi như "asdf", chúng sẽ được phân tích cú pháp thay vì hiển thị, để một ứng dụng web mở để tấn công. – user1106210

Các vấn đề liên quan