2012-10-05 22 views
1

有沒有辦法用文字語法這樣生成XML:斯卡拉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。沒關係,但我覺得你可以更簡潔 - 幾乎與我在上面的代碼中提出的一樣簡潔。

謝謝。

回答

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> 
+0

我的不好,理解返回元素向量,我認爲它不會被接受。我不明白scala編譯器如何自動將它轉換爲可以接受到文字語法定義中的東西。 – lolski

+0

據我所知,任何可以隱式轉換爲'NodeSeq'的東西都可以在' {...}'中找到。 (這只是我的假設;如果我錯了,有人糾正我) – Dylan

1

您是否特意使用for理解?如果不是,這應該給你你正在尋找的輸出:

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

我完全沒有理解map或flatMap的內在性,但我會研究它,這個也很優雅。 – lolski

0

如果您需要for語法,則需要從Seq [Node]到NodeSeq的隱式轉換。我會寫下代碼,但我現在在我的手機上...