带有for-yield的Scala XML文字生成

时间:2012-10-05 00:01:49

标签: xml scala

有没有办法使用文字语法生成XML:

<a>
{
  for (i <- Range(1, 3)) yield {
    <b>{i}</b>
  }
}
</a>

将返回

<a><b>1</b><b>2</b></a>

即。我想只使用一个复合语句,它将以某种方式返回完整的XML文字。

我知道的唯一方法是分两步完成:在第一步中,for-yield语句将返回IndexedSeq或类似的东西,然后在第二步中我必须将其转换为scala.xml.Elem。没关系,但我觉得你可以更简洁 - 几乎和我在上面的代码中提出的一样简洁。

感谢。

3 个答案:

答案 0 :(得分:1)

你是否特别想使用for comprehension?如果没有,这应该为您提供您正在寻找的输出:

<a>{
  (Range(1, 3)).map{ vl => 
     <b>{vl}</b>
  }
}</a>

答案 1 :(得分:1)

你发布的内容很好......

如果您希望在输入方面更简洁,可以使用

的内部声明
(1 to 3).map{i => <b>{i}</b>}
//or
for(i<-1 to 3) yield <b>{i}</b>

那么你就是这样:

val xml = <a>{ (1 to 3).map{ i => <b>{i}</b> } }</a>

哪个给出了

xml: scala.xml.Elem = <a><b>1</b><b>2</b><b>3</b></a>

答案 2 :(得分:0)

如果需要for语法,则需要从Seq [Node]到NodeSeq的隐式转换。我会写下代码,但我现在正在打电话......