如何NodeSeq
通过它的 id 选择一个?
在 lift 中,有 " CssSelectors
" 允许您执行类似的操作"#myId" #> function
,并且function
将仅接收所需的 NodeSeq 作为输入。
但是我如何使用这个精细的“css 选择器”来选择节点,而不仅仅是在之后直接应用一个函数?
我知道可以通过搜索"id"
NodeSeq 中的所有属性来完成,但它不是比 Lift 的版本更消耗 CPU 吗?有什么想法或建议吗?
有几种方法可以遍历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 选择器的内容。
使用 ^^ 选择器(它忽略 #> 的右侧):
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 属性本身。