Skip to content

Instantly share code, notes, and snippets.

@Centaur
Created March 18, 2012 14:18
Show Gist options
  • Save Centaur/2073761 to your computer and use it in GitHub Desktop.
Save Centaur/2073761 to your computer and use it in GitHub Desktop.
scala xml css selector
import xml._
case class CssSelector(css:String) {
def find(node:Node):Seq[Node]
def unique(node:Node):Option[Node] = find(node).headOption
}
assert(CssSelector("div.some_class").unique(<div><div class="some_class">abc</div></div>).get.text == "abc")
assert(CssSelector("div#some_id span.some_class".unique(
<div id="some_id" class="any_class">
<div>
<span class="some_class other_class">cde</span>
</div>
</div>
).get.text == "cde"
@notyy
Copy link

notyy commented Mar 19, 2012

是不是解析这段html,取出cde?

 <div>
     <div id="some_id" class="any_class">
        <div>
           <span class="some_class other_class">cde</span>
       </div>
     </div> 
   <div id="another_id" class="any_class">
      <div>
           <span class="some_class other_class">xyz</span>
      </div>
   </div>
</div>

   scala> val render = "#some_id" #> {"span" #> {".some_class *" #> {in => println("content is:\n" + in); <b></b>} }}
   render: net.liftweb.util.CssSel = CssBind(Full(#some_id), Full(IdSelector(some_id,Empty)))

  scala> render(source)
  content is:
  cde

res15: scala.xml.NodeSeq =
   NodeSeq(<div>
     <div id="some_id" class="any_class">
       <div>
       <span class="some_class other_class"><b></b></span>
   </div>
 </div>
  <div class="any_class" id="another_id">
     <div>
       <span class="some_class other_class">xyz</span>
    </div>
  </div>
</div>)

改进:

  scala> val cssList = List("#some_id","span",".some_class *")
  cssList: List[java.lang.String] = List(#some_id, span, .some_class *)

def renderRecur(cssList:List[String]):(NodeSeq => NodeSeq) = cssList match {
  case List() => {in => println("in=\n" + in);in}
  case css :: xs => css #> {renderRecur(xs)}
}

scala> renderRecur(cssList)(source)
in=
cde

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment