如何通过它的ID选择NodeSeq
?
在电梯中,有“CssSelectors
”允许您执行"#myId" #> function
之类的操作,而function
只会收到所需的NodeSeq作为输入。
但是如何使用这个精细的“css选择器”来选择节点,而不仅仅是直接应用一个函数?
我知道可以通过搜索NodeSeq中的所有"id"
属性来完成,但是它不比Lift的版本更耗费CPU吗?有什么想法或建议吗?
答案 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属性本身。