选择NodeSeq的id(​​IdSelector?)

时间:2013-05-14 08:10:17

标签: scala lift

如何通过它的ID选择NodeSeq

在电梯中,有“CssSelectors”允许您执行"#myId" #> function之类的操作,而function只会收到所需的NodeSeq作为输入。

但是如何使用这个精细的“css选择器”来选择节点,而不仅仅是直接应用一个函数?

我知道可以通过搜索NodeSeq中的所有"id"属性来完成,但是它不比Lift的版本更耗费CPU吗?有什么想法或建议吗?

2 个答案:

答案 0 :(得分: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>)

我认为上述内容不比Lift版本更加耗费CPU,但也没有理由不能使用lift的CssSelector - 它已被打破,因此甚至不需要升降机框架的其余部分。所以,像:

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

你也可以使用递归和模式匹配来解决问题。

如果你对Lift实际上如何匹配感兴趣,你可以看看CSS选择器的东西here

答案 1 :(得分:1)

使用^^选择器(忽略#&gt;的右侧):

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"/>)

至于性能,很明显,Lift必须迭代id属性本身。