2

如何NodeSeq通过它的 id 选择一个?

在 lift 中,有 " CssSelectors" 允许您执行类似的操作"#myId" #> function,并且function将仅接收所需的 NodeSeq 作为输入。

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

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

4

2 回答 2

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 选择器的内容。

于 2013-05-14T14:58:49.710 回答
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"/>)

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

于 2013-05-17T05:51:42.847 回答