【问题标题】:select NodeSeq by it's id (IdSelector?)通过它的 id 选择 NodeSeq (IdSelector?)
【发布时间】:2013-05-14 08:10:16
【问题描述】:

如何通过 id 选择 NodeSeq

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

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

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

【问题讨论】:

    标签: scala lift


    【解决方案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 属性本身。

    【讨论】:

    • 谢谢!!这正是我一直在寻找的!关于性能——我仍然会质疑这一点。例如,在大多数情况下,Lift 使用的模板和选择器数量有限。模板(NodeSeq)和选择器都是不可变的。为什么 Lift 不仅缓存 NodeSeq,还缓存应用的选择器?例如,如果 Lift 缓存了一个模板 (.html) 并在该模板上看到了一个选择器,他可能会记住一些结果。
    • 我的意思是,AFAIK Lift 不这样做,但他可以。也许将来会。
    【解决方案2】:

    有几种方法可以遍历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(&lt;li id="findme"&gt;&lt;/li&gt;)

    我不认为上面的版本比 Lift 的版本更占用 CPU,但你也没有理由不能使用 lift 的 CssSelector - 它已损坏,因此甚至不需要 Lift 框架的其余部分。所以,类似:

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

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

    如果您对 Lift 的实际匹配方式感兴趣,可以查看 CSS 选择器内容 here

    【讨论】:

    • 感谢您的回答!关于第一种方法和第二种方法——嗯,我已经在问题中提到了它们。您真的可以遍历 NodeSeq 并尝试从内部捕获模板。目标是将 NodeSeq 作为变量捕获,以便之后能够使用它。无论如何,Lift 的 BindHelpers 的链接很有用,谢谢。)
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 2013-05-01
    • 2012-09-09
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多