2011-01-07 16 views

Antwort

11

Sie können nichts mit den vorhandenen \ oder \\ Methoden auf NodeSeq tun. Aber Sie können erweitern NodeSeq mit einer neuen \* Methode (man beachte das Fehlen oder Leerzeichen), gemäß den pimp-your-Bibliothek Muster:

import xml.{NodeSeq, Elem} 

class ChildSelectable(ns: NodeSeq) { 
    def \* = ns flatMap { _ match {          
    case e:Elem => e.child         
    case _ => NodeSeq.Empty         
    } } 
} 

implicit def nodeSeqIsChildSelectable(xml: NodeSeq) = new ChildSelectable(xml) 

Im REPL ergibt dies dann mich:

scala> val xml = <a><b><c>xxx</c></b></a> 
xml: scala.xml.Elem = <a><b><c>xxx</c></b></a> 

scala> xml \*                    
res7: scala.xml.NodeSeq = NodeSeq(<b><c>xxx</c></b>) 

scala> xml \ "b" \* 
res8: scala.xml.NodeSeq = NodeSeq(<c>xxx</c>) 

scala> xml \ "b" \ "c" \* 
res9: scala.xml.NodeSeq = NodeSeq(xxx) 
6

Das ist ziemlich nah an, was Sie suchen:

import scala.xml.Elem 

val xml = <a><b><c>HI</c></b></a> 

println(xml) 
println(xml \ "_") 
println(xml \ "b") 
println(xml \ "b" \ "_") 
println(xml \ "b" \ "c") 
println(xml \ "b" \ "c" \ "_") 


<a><b><c>HI</c></b></a> 
<b><c>HI</c></b> 
<b><c>HI</c></b> 
<c>HI</c> 
<c>HI</c> 
// Empty 
+0

Th ist besser als die angenommene Antwort. '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _' _ Weniger zu pflegender Code, weniger nicht standardisierte Syntax, um den nächsten Typ, der Ihren Code betrachtet, zu verwirren. – rumtscho

+0

überschätzt diesen Awnser nicht. scala-xml ist kaputt. Verwenden Sie etwas wie https://github.com/lihaoyi/scaladags oder https://github.com/chris-twiner/scalesXml –

Verwandte Themen