2013-05-14 41 views
2

如何通過id選擇NodeSeq通過它的id選擇NodeSeq(IdSelector?)

在電梯中,有「CssSelectors」,允許您執行類似"#myId" #> function的操作,而function只接收所需的NodeSeq作爲輸入。

但是,如何使用這個好的「css選擇器」來選擇節點,而不是直接在後面應用一個函數?

我知道它可以通過搜索NodeSeq中的所有"id"屬性來完成,但是它不是比Lift的版本更耗CPU嗎?任何想法或建議?

回答

1

使用^^選擇器(它忽略#右側>):

scala> import net.liftweb.util.Helpers._ 
import net.liftweb.util.Helpers._ 

scala> "#id ^^" #> "" apply <test><el id="id"/></test> 
res0: scala.xml.NodeSeq = NodeSeq(<el id="id"/>) 

至於性能方面,顯然升力必須要遍歷ID屬性本身。

+0

謝謝!這正是我所期待的! 關於表現 - 我仍然會質疑。例如,在大多數情況下,Lift使用的模板和選擇器數量有限且少量。模板(NodeSeq)和選擇器都是不可變的。 爲什麼不提升高速緩存不僅是NodeSeq,而是應用選擇器? 例如,如果Lift的緩存模板(.html)並在此模板上看到選擇器,他可能會記憶一些結果。 – VasyaNovikov 2013-05-17 15:34:53

+0

我的意思是,AFAIK電梯不這樣做,但他可以。也許會在未來。 – VasyaNovikov 2013-05-17 15:44:13

1

有幾種方法可以遍歷NodeSeq

val myNodeSeq = 
    <div> 
    <ul> 
     <li id="findme"></li> 
     <li></li> 
    </ul> 
    </div> 

我們可以使用Scala的XML解析器做這樣的事情:

myNodeSeq \\ "li" filter(_ \ "@id" contains scala.xml.Text("findme")) 

這將返回:NodeSeq(<li id="findme"></li>)

我不認爲上述任何更多的CPU比Lift的版本密集,但是沒有理由不能使用lift的CssSelector--它已經被打破了,所以甚至不需要其他的升降框架。所以,像這樣:

("#findme" #> { ns => 
    //do something with ns - which is the NodeSeq that matches 
}).apply(myNodeSeq) 

你也可以使用遞歸和模式匹配工作。

如果您對Lift實際上是如何匹配的感興趣,可以查看CSS選擇器的東西here

+0

感謝您的回答! 關於第一種方法和第二種方法 - 我已經在提問中提到了它們。你真的可以迭代NodeSeq並嘗試從內部捕獲模板。目標是將NodeSeq作爲一個變量來捕獲,以便以後使用它。 無論如何,鏈接到電梯的BindHelpers是有用的,謝謝。) – VasyaNovikov 2013-05-17 15:41:35