抗XML

2012-06-21 54 views
3

this question荏苒拉鍊,提問者想轉換文檔這樣的:抗XML

<text> 
    The capitals of Bolivia are <blank/> and <blank/>. 
</text> 

進入這個:

<text> 
    The capitals of Bolivia are <input name="blank.1"> and <input name="blank.2">. 
</text> 

正如我在my answer there指出,Anti-XML的提供乾淨的解決這個問題。以下,例如,將工作重新命名空白元:

import com.codecommit.antixml._ 

val q = <text>The capitals of Bolivia are <blank/> and <blank/>.</text>.convert 

(q \\ "blank").map(_.copy(name = "input")).unselect 

不幸的是,以下不工作:

(q \\ "blank").zipWithIndex.map { case (el, i) => el.copy(
    name = "input", 
    attrs = Attributes("name" -> "blank.%d".format(i + 1)) 
)}.unselect 

因爲當然一旦我們zipWithIndex -ed拉鍊我們沒有更長的拉鍊,只是IndexedSeq - 我們不能有Zipper[(Node, Int)],因爲定義是trait Zipper[+A <: Node] ...

是否有上反XML拉鍊使用zipzipWithIndex,做一些其他的操作與map等,並與東西,仍然是一個拉鍊落得個乾淨的方式?

回答

2

我想不出一個直接的方式來實現你所需要的,但如果你願意去低級別的功能,你可以使用一個fold,如:

val blanks = q \\ "blank" 

(0 until blanks.size).foldLeft(blanks) {case (z, i) => z.updated(i, z(i).copy(
    name = "input", 
    attrs = Attributes("name" -> "blank.%d".format(i + 1))) 
)}.unselect 

注意拉鍊是一個隨機存取容器,所以在這種情況下,效率不應該成爲問題。