我試圖替換一些XML,並且需要一個累加器。說我有一個填充式的空白存儲爲XML,像這樣的問題:在Scala中修改XML而無突變?
val q = <text>The capitals of Bolivia are <blank/> and <blank/>.</text>
在某些時候,我會想將這些空白轉換成HTML輸入元素,我需要能夠區分第一和第二,所以我可以檢查他們。 (忽略這樣的事實,在這種情況下,兩個首都可以以任何順序出現 - 這是我後面將要討論的頭痛。)
感謝StackOverflow上的一些可愛答案,我制定了以下解決方案:
import scala.xml._
import scala.xml.transform._
class BlankReplacer extends BasicTransformer {
var i = 0
override def transform(n: Node): NodeSeq = n match {
case <blank/> => {
i += 1
<input name={ "blank.%d".format(i) }/>
}
case elem: Elem => elem.copy(child=elem.child.flatMap(transform _))
case _ => n
}
}
這個工作相當不錯。我要創建一個new BlankReplacer()
我要開始重新編號每一次,但它幾乎著作:
scala> new BlankReplacer()(q)
res6: scala.xml.Node = <text>The capitals of Bolivia are <input name="blank.1"></input> and <input name="blank.2"></input>.</text>
這裏的問題。是否有一種簡單的方法可以避免我每次更換<blank/>
時必須要做的突變?我擁有的東西並沒有讓我感到恐怖,但我認爲如果我不是每次需要將問題轉換爲HTML時創建BlankReplacer
類的新實例,那麼這可能會更清潔。我確信有一些方法可以將它變成累加器,但我不知道如何去做。
謝謝! 託德
假設你的問題不包含'''%''',看到https://gist.github.com/2965695(這太可怕了,我知道:-) – opyate
其實,這是相當聰明,但恐怕很可能我們在某個時候需要百分號。 – TOB
是的,你可以計算'%d'的實例,但是我的午餐時間用完了:-) – opyate