如何将scala.xml.NodeSeq强制转换为Elem?

时间:2014-06-17 20:55:50

标签: scala

我试图减少元素列表

List(1, 2, 3).map{n => <a>{n}</a>}.reduce{(a,b)=> a ++ b}

但是我收到了这个错误

<console>:8: error: type mismatch;
 found   : scala.xml.NodeSeq
 required: scala.xml.Elem
       List(1, 2, 3).map{n => <a>{n}</a>}.reduce{(a,b)=> a ++ b}

如何将NodeSeq转换为Elem?

3 个答案:

答案 0 :(得分:4)

在这种情况下我会使用reduce。相反,请尝试foldLeft

List(1, 2, 3).map{n => <a>{n}</a>}.foldLeft(NodeSeq.Empty){(a,b)=> a ++ b}

map reducefold和{{1}} a whole blog post如果您对函数式编程不熟悉,可能会有帮助。

答案 1 :(得分:2)

除了joescii的回答之外,您甚至不需要使用foldLeft来生成一系列节点。由于List已经是一个序列而Seq[Node]被隐式转换为NodeSeq,因此您可以写下以下内容:

val x : NodeSeq = List(1, 2, 3).map{n => <a>{n}</a>}

此外,由于节点序列不是有效的XML文档(打破单根元素契约),您可能会将其用作生成XML的临时步骤,然后使用某些父元素包装这些节点。

如果是这种情况,则显式转换为NodeSeq是不必要的,因为它将隐式完成,如下例所示:

val x = List(1, 2, 3).map{n => <a>{n}</a>}
<b>{x}</b>

答案 2 :(得分:0)

除了其他答案,将NodeSeq转换为Elem的最简单方法是:

val elemVar = nodeSeqVal(0)

如果您确定NodeSeq中始终存在唯一的节点,则可以正常工作,否则您将丢失剩余的数据。