2011-01-07 14 views

答えて

11

の既存の\または\\の方法では何もできません。 しかし、あなたはポン引き、あなたのライブラリパターンに従って、新しい\*方法(注意不足や空白文字)でNodeSeqを拡張することができます。

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) 

REPLでは、これは、私を与えます:

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

これは、あなたが探しているものにかなり近いです:

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受け入れられた答えよりも優れています。 '' _ ''は、新しいメソッドを書く必要なく、求められたことを正確に行います。管理するコードが少なくて済み、コードを見ている次の人を混乱させる非標準の構文が少なくなります。 – rumtscho

+0

このawnserを過大評価しないでください。 scala-xmlが壊れています。 https://github.com/lihaoyi/scalatagsやhttps://github.com/chris-twiner/scalesXmlのようなものを使用してください –

関連する問題